我试图理解Nginx的try_files指令是如何工作的。 Nginx正在我的服务器上运行,并提供位于/usr/share/nginx/html/index.html
的默认页面。
但是,我在/var/www/test/index.html
的文件系统中有一个简单的HTML页面。以下配置文件未导致该文件被提供。我想理解为什么不这样做,以及我需要做出哪些改变才能实现它。
以下是default.conf
的相关部分:
server {
listen 80;
server_name localhost;
root /var/www;
try_files /test/index.html /;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
答案 0 :(得分:161)
一个非常常见的try_files行,可以应用于你的条件
location / {
try_files $uri $uri/ /test/index.html;
}
您可能理解第一部分,location /
匹配所有位置,除非它与更具体的位置匹配,例如location /test
第二部分(try_files
)表示当您收到与此块匹配的URI时首先尝试$uri
,例如http://example.com/images/image.jpg
nginx会尝试检查内部是否有文件/images
调用image.jpg
,如果发现它将首先提供服务。
第二个条件是$uri/
,这意味着如果您没有找到第一个条件$uri
,请尝试将URI作为目录,例如http://example.com/images/
,ngixn将首先检查是否调用了一个文件images
存在然后它找不到它,然后进行第二次检查$uri/
并查看是否存在名为images
的目录,然后它将尝试提供它。
旁注:如果您没有autoindex on
,则可能会收到403禁止错误,因为默认情况下禁止使用目录列表。< / p>
编辑:我忘了提到如果你定义了
index
,nginx会尝试检查索引是否存在于此文件夹中 尝试目录列表。
第三个条件/test/index.html
被视为后退选项,(您需要使用至少2个选项,一个和后退),您可以尽可能多地使用(之前从未阅读过收缩) ,nginx将在文件夹index.html
中查找文件test
并在其存在时提供。
如果第三个条件也失败,那么nginx将提供404错误页面。
还有一些叫做命名的位置,比如这个
location @error {
}
您可以使用try_files
这样称呼
try_files $uri $uri/ @error;
提示:如果您只想提供1个条件,例如在文件夹images
内,您只想提供图像或转到404错误,您可以写像这样的一条
location /images {
try_files $uri =404;
}
这意味着要么提供文件要么提供404错误,要么不能$uri
自己使用=404
,因为您需要有后备选项。
您还可以选择所需的错误代码,例如:
location /images {
try_files $uri =403;
}
如果图像不存在,这将显示禁止的错误,或者如果您使用500,则会显示服务器错误等。