Nginx
為什麼nginx在嘗試打開目錄時返回301狀態碼?
我試圖了解 Nginx 的工作原理。現在我正在研究
index
和try_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
我找不到以前的行為記錄在哪裡。