我有一个项目,其中必须将所有未找到的文件重定向到 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 就没有参考点。服务器无法猜测它最后所在的目录或用户想要的目录。如果这不能满足您的要求,请回复评论,我会启动一个服务器进行快速测试。