将 apache 重写转换为 nginx 重写

将 apache 重写转换为 nginx 重写

我有一个项目,其中必须将所有未找到的文件重定向到 index.php。我在 apache 中通过将 .htaccess 文件放在我的项目文件夹中来执行此操作。该文件的内容是--

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

现在我想在 nginx 中实现同样的功能。我的 nginx.conf 如下所示

root   /usr/local/apache2/htdocs;
index  index.php index.html index.htm;
location /project/ {
            root   /usr/local/apache2/htdocs;
            index  index.php index.html index.htm;
            try_files $uri $uri/ index.php;
}

现在,每当我发出类似的请求时http://localhost/project/hello,该请求应该转到,http://localhost/project/index.php但是这说File not found

现在我认为这会起作用的原因是,由于root位置块内的指令会覆盖root块外的指令(尽管它们的值相同),因此重写模块会查找/usr/local/apache2/htdocs/project/index.php。我在这里遗漏了什么?

更新

此配置有效

root   /usr/local/apache2/htdocs;
location /project/ {
            index  index.php index.html index.htm;    #effectively root here is /usr/local/apache2/htdocs
            try_files $uri $uri/ /project/index.php;
 }

但我不明白为什么这应该有效,因为正如文档中指出的那样这里root位置块中匹配的目录将附加到指令的值中

答案1

 location /project/ {
             root   /usr/local/apache2/htdocs;
             index  index.php index.html index.htm;
-            try_files $uri $uri/ index.php;
+            try_files $uri $uri/ /project/index.php;
 }

也许您需要在 URL 中指定根目录?否则,URL 就没有参考点。服务器无法猜测它最后所在的目录或用户想要的目录。如果这不能满足您的要求,请回复评论,我会启动一个服务器进行快速测试。

相关内容