我有一个示例Web服务器,其中www目录中只有一个index.html文件。我可以使用以下配置设置Nginx:
location /subfolder {
alias /data/www;
try_files $uri $uri/ /index.html;
}
在浏览器中,我可以在本地域test.local/subfolder
上看到正确的响应,test.local/subfolder/something
也会返回一个默认的nginx页面(这是正常的,因为未设置root)
如果我将配置更改为
location /subfolder {
alias /data/www;
try_files $uri $uri/ /index.html =404;
}
对test.local/subfolder
的响应仍然是正确的,但是test.local/subfolder/something
和所有带有/ subfolder前缀的URI返回的index.html正确响应的状态也为200,而不是404。如果我删除了/index
从try_files中我得到相同的结果
我想知道nginx如何处理带有= 404后备的请求,但找不到任何信息,即使在正式文档中也是如此。
UDAPTE:
我发现别名指令应以/
结尾,但由于状态仍为200ok,因此仍无法获得= 404功能和目的
答案 0 :(得分:2)
try_files
指令仅支持以下语法:
try_files file ... uri;
try_files file ... =code;
它不支持:
try_files file ... uri =code;
此处file
和uri
之间的区别在于,对于file
自变量,NGINX将在继续下一个自变量之前检查其存在性;对于uri
,不会。
如果最后一个参数的形式为=code
,则所有在先参数均为file
(检查是否存在)。
由此,您可以得出结论,请求URI为/foo/bar
并具有以下配置:
root /var/www;
location /foo/ {
try_files $uri $uri/ =404;
}
...如果存在任何file
,则不会触发404错误:
/var/www/foo/bar
/var/www/foo/bar/
目录(如果已启用autoindex
)/var/www/foo/bar/index.html
(或index.php
等)(由于index
的值)仅当以上都不存在时,NGINX将触发404错误。
答案 1 :(得分:1)
您应该定义服务器的根目录,然后定义默认索引,然后将=404
添加到try_files
:
server {
server_name example.com;
root /var/www/html/example.com;
index index.html index.htm index.php;
# This is optional - if you want a customized 404 error page
error_page 404 /404.html;
location /subfolder {
try_files $uri $uri/ =404;
}
}
root
和alias
之间的区别在于,root
附加了location
以获取文件系统中的绝对路径,而alias
则排除了{{1} }。因此,例如,当您尝试获取location
http://example.com/subfolder/filename.txt
将在{p>时返回server_name example.com;
root /var/www/html/example;
location /subfolder {
try_files $uri $uri/ =404;
}
的内容(如果存在)
/var/www/html/example/subfolder/filename.txt
将返回server_name example.com;
location /subfolder {
alias /var/log;
try_files $uri $uri/ =404;
}
的内容(如果存在)