Nginx 从 /index.php 获取 /,其他地方没有“目录索引被禁止”

Nginx 从 /index.php 获取 /,其他地方没有“目录索引被禁止”

我需要/被展示像/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;

https://stackoverflow.com/questions/19285355/nginx-403-error-directory-index-of-folder-is-forbidden/38046124#38046124

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;
}

相关内容