为什么 nginx 在尝试打开目录时返回 301 状态代码?

为什么 nginx 在尝试打开目录时返回 301 状态代码?

我正在尝试了解 Nginx 的工作原理。现在我正在研究indextry_files指令。我的配置文件如下:

events {}
http {
  rewrite_log on;
  error_log /var/log/nginx/localhost.error_log debug;

  server {
    root /app;
    listen 8080;
    index index.html;
    location / {
      try_files $uri $uri/ =404;
    }
  }
}

/app/树目录也是:

/app
|-- abcd.html
|-- file.php
|-- index.html
|-- index.php
|-- sss
|   `-- index.html
|-- style.css
`-- thumb.png

当我尝试打开时,localhost:8080一切都按预期工作。它首先使用location /上下文。然后用于$uri/读取根目录。然后由于已指定索引文件名,它使用该目录中的索引文件。此外,日志文件可以显示:

...
2021/10/27 11:37:49 [debug] 1297#1297: *1 test location: "/"
2021/10/27 11:37:49 [debug] 1297#1297: *1 using configuration "/"
...
2021/10/27 11:37:49 [debug] 1297#1297: *1 generic phase: 12
2021/10/27 11:37:49 [debug] 1297#1297: *1 try files handler
2021/10/27 11:37:49 [debug] 1297#1297: *1 http script var: "/"
2021/10/27 11:37:49 [debug] 1297#1297: *1 trying to use file: "/" "/app/"
2021/10/27 11:37:49 [debug] 1297#1297: *1 http script var: "/"
2021/10/27 11:37:49 [debug] 1297#1297: *1 trying to use dir: "/" "/app/"
2021/10/27 11:37:49 [debug] 1297#1297: *1 try file uri: "/"
2021/10/27 11:37:49 [debug] 1297#1297: *1 generic phase: 13
2021/10/27 11:37:49 [debug] 1297#1297: *1 content phase: 14
2021/10/27 11:37:49 [debug] 1297#1297: *1 open index "/app/index.html"
2021/10/27 11:37:49 [debug] 1297#1297: *1 internal redirect: "/index.html?"
...

但是当我打开时localhost:8080/sss,它首先会重定向到localhost:8080/sss/,然后打开目录内的索引文件sss/。以下是日志:

2021/10/27 11:46:07 [debug] 1297#1297: *3 test location: "/"
2021/10/27 11:46:07 [debug] 1297#1297: *3 using configuration "/"
2021/10/27 11:46:07 [debug] 1297#1297: *3 http cl:-1 max:1048576
2021/10/27 11:46:07 [debug] 1297#1297: *3 rewrite phase: 3
2021/10/27 11:46:07 [debug] 1297#1297: *3 post rewrite phase: 4
2021/10/27 11:46:07 [debug] 1297#1297: *3 generic phase: 5
...
2021/10/27 11:46:07 [debug] 1297#1297: *3 try files handler
2021/10/27 11:46:07 [debug] 1297#1297: *3 http script var: "/sss"
2021/10/27 11:46:07 [debug] 1297#1297: *3 trying to use file: "/sss" "/app/sss"
2021/10/27 11:46:07 [debug] 1297#1297: *3 http script var: "/sss"
2021/10/27 11:46:07 [debug] 1297#1297: *3 trying to use dir: "/sss" "/app/sss"
2021/10/27 11:46:07 [debug] 1297#1297: *3 try file uri: "/sss"
2021/10/27 11:46:07 [debug] 1297#1297: *3 generic phase: 13
2021/10/27 11:46:07 [debug] 1297#1297: *3 content phase: 14
...
2021/10/27 11:46:07 [debug] 1297#1297: *3 content phase: 18
2021/10/27 11:46:07 [debug] 1297#1297: *3 http filename: "/app/sss"
2021/10/27 11:46:07 [debug] 1297#1297: *3 add cleanup: 000055AA4A146290
2021/10/27 11:46:07 [debug] 1297#1297: *3 http static fd: -1
2021/10/27 11:46:07 [debug] 1297#1297: *3 http dir
2021/10/27 11:46:07 [debug] 1297#1297: *3 http finalize request: 301, "/sss?" a:1, c:1
2021/10/27 11:46:07 [debug] 1297#1297: *3 http special response: 301, "/sss?"
2021/10/27 11:46:07 [debug] 1297#1297: *3 http set discard body
...

为什么它没有响应目录内的索引文件sss/,就像根目录一样,没有外部重定向?

答案1

$uri/语句上的术语的工作try_files方式与 Nginx 默认行为相同。

如果你提供 URI没有/指向目录的尾随,Nginx 将首先/使用外部重定向(即301)附加尾随。

如果你提供 URI/指向目录的尾随,该index指令将被调用,并可能生成到指定的文件的内部重定向(例如index.html)。

虽然文档/很明显,该指令要求尾随index。我找不到以前的行为记录在哪里。

相关内容