如何使这个try_files指令工作?

时间:2013-07-22 22:20:19

标签: nginx

我试图理解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;
    }

1 个答案:

答案 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,则会显示服务器错误等。