我需要/
被展示像/index.php
。
现在我有
index index.php;
if ( $request_uri = /index.php ) { return 301 /; }
location / { try_files $uri $uri/ =404; }
一切正常,但也存在一些错误,例如
directory index of "/home/.../public_html/tmp/" is forbidden
我想删除它。这里的问题$uri/
是try_files $uri $uri/ =404;
Ubuntu + Nginx:“/var/www/app/my-app/”目录索引被禁止
但如果我将其更改为try_files $uri =404;
或,try_files $uri /index.html index.php =404;
则“/”将停止工作并显示 404
为什么$uri/
如果我有,删除后会阻止显示 index.php index index.php;
?
我该如何设置/
检查index.php
,如果没有 index.php 则只显示 404 而不抛出“被禁止”错误?
答案1
$uri/
声明中的术语有try_files
两个不同的目的。
如果 URI 不以 结尾/
,但引用了目录,Nginx 将生成 301 重定向以附加/
。
如果 URI 以 结尾/
并引用目录,则会调用索引功能,这可能导致内部重定向到索引文件,或者如果未找到索引文件则导致 403 响应。
抑制 403 响应而不影响太多其他事物的一个解决方案是处理以/
不同结尾的 URI。
例如:
location ~ /$ {
if (-f ${request_filename}index.php) {
rewrite ^(.*)/$ $1/index.php last;
}
return 404;
}
以上将测试index.php
目录内是否存在,如果不存在则返回 404。
答案2
下面的方法可能有效:
location = /index.php {
return 301 /;
}
location / {
try_files $uri $uri/ /index.php =404;
}