Nginx

為什麼nginx在嘗試打開目錄時返回301狀態碼?

  • October 27, 2021

我試圖了解 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/目錄內的索引文件,就像根目錄一樣,沒有外部重定向?

語句中的$uri/術語try_files與 Nginx 預設行為的工作方式相同。

如果您提供的 URI沒有尾隨/指向目錄,Nginx 將首先/使用外部重定向(即301)附加尾隨。

如果您提供帶有/指向目錄的尾隨的 URI,index則將呼叫該指令並可能生成到指定文件的內部重定向(例如index.html)。

儘管文件清楚地表明指令/需要尾隨。index我找不到以前的行為記錄在哪裡。

引用自:https://serverfault.com/questions/1081839