我正在尝试了解 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/
,就像根目录一样,没有外部重定向?
答案1
$uri/
语句上的术语的工作try_files
方式与 Nginx 默认行为相同。
如果你提供 URI没有/
指向目录的尾随,Nginx 将首先/
使用外部重定向(即301
)附加尾随。
如果你提供 URI和/
指向目录的尾随,该index
指令将被调用,并可能生成到指定的文件的内部重定向(例如index.html
)。
虽然文档/
很明显,该指令要求尾随index
。我找不到以前的行为记录在哪里。