我正在使用php中的rest。在开发中,我总是使用php -S 127.0.0.1:9000
托管本地php。现在,我需要托管我在安装了Apache的vps中构建的rest。我该怎么做?让我解释一下我想要实现的url模式。假设我的域是beautifulrest.com。我需要将这个api托管到medifulrest.com/api/。问题就出现在这里。我构建了我的api,以便当用户转到美观REST.com/api / user /create时,没有/user/create文件夹,但是url由php动态处理,代码如下:$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); $uri = explode('/', $uri);
。在Apache中,如果我转到美妙的REST.com/api /user/create,它会尝试查找/user/create文件夹,但是没有这样的文件夹。如果我想实现与开发中相同的效果,我需要请求美观的REST.com/api/index.php/user/create,现在将url解析到php侧。我要问的是:是否有一种方法可以使用apache的Mod_rewrite重写url,这样就可以重新编写_~_
这在nginx中也有可能吗?
耽误您时间,实在对不起!
发布于 2022-09-29 16:24:57
使用FallbackResource
(mod_dir)
您可以在.htaccess
子目录中创建一个/api
文件,并使用mod_dir的FallbackResource
。(如果您只需要一个标准的前端控制器模式,则不需要特别使用mod_rewrite。)例如:
FallbackResource /api/index.php
现在,任何通常会触发404 Not的/api/<anything>
请求都会被路由到/api/index.php
。
并使用现有的PHP代码来解析$_SERVER['REQUEST_URI']
。
通过将.htaccess
文件放置在/api
子目录中,而不是根目录中,它将自然地只应用于对/api/<anything>
的请求,而不是字面上的/<anything>
。
参考资料:
替代使用mod_rewrite (RewriteRule
和RewriteCond
)
要使用mod_rewrite实现相同的功能,您可以执行如下操作。同样,在/api/.htaccess
文件中:
# /api/.htaccess
DirectoryIndex index.php
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
第一个RewriteRule
只是一个简单的优化,防止了进一步不必要的处理(即。文件系统检查)何时前控制器(即。( index.php
)已被重写为(按照下面的规则)。
第一和第二条件(RewriteCond
指令)检查请求是否已经分别映射到文件或目录。
RewriteRule
模式( RewriteRule
指令的第一个参数)只是一个点(即。( .
)所以要匹配某物.非根请求。对根目录的请求由mod_dir的DirectoryIndex
(上面定义)处理。
注意,替换字符串( RewriteRule
指令的第二个参数),即。简单地说,index.php
使用一个相对的文件路径。这是相对于包含.htaccess
文件的目录,即。/api
在这种情况下。因此,结果是对/api/index.php
的重写。这里不需要硬编码父目录。
但是,如果这是您所要做的全部工作,那么这与刚才只使用FallbackResource
的解决方案没有任何好处,只是/api
子目录不需要在规则中显式声明。
重写url,以便将
example.com/api/index.php/user/create
重写为example.com/api/user/create
它是朝另一个方向重写的。即。从/api/user/create
到/api/index.php/user/create
。但是,如果您的现有代码已经配置为使用PATH_INFO
,那么这里似乎不需要使用REQUEST_URI
https://stackoverflow.com/questions/73898413
复制相似问题