在以下 nginx 的配置片段中:
server {
listen 443;
listen [::]:433;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
server_name example.com;
root /var/www/example.com;
index index.html;
error_page 502 = @fallback;
error_page 404 = @not_found;
location / {
#try_files /index.html $uri =404; # A
try_files $uri =404; # B
}
location /service/ {
rewrite ^/service/(.*)$ /$1 break;
proxy_set_header X-Load-Balancer "a";
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://127.0.0.100:42424;
}
location @fallback {
try_files /502.html =500;
}
location @not_found {
try_files /404.html =500;
}
}
为什么 A 可以正确提供 index.html(位于 /var/www/example.com/),而 B 却不能,而是提供 404.html 页面?
答案1
该try_files
指令按顺序处理每个术语,直到找到存在的文件。
如果文件/var/www/example.com/index.html
存在,则情况 (A) 中的第一个术语将始终成功,并且 URI 将在内部更改为/index.html
。index
指令不参与。此外,情况 (A) 将总是返回/index.html
文件。
在情况 (B) 中,try_files
仅查找文件,并且不是目录。如果要try_files
匹配目录并使用指令的值对其进行处理index
,请使用带有尾随 的术语/
。例如:
try_files $uri $uri/ =404;
看这个文件了解详情。