73

我试图了解 Nginx 的try_files指令是如何工作的。Nginx 在我的服务器上运行并提供位于/usr/share/nginx/html/index.html.

但是,我有一个简单的 HTML 页面,位于/var/www/test/index.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;
    }
4

1 回答 1

235

可以根据您的情况应用的非常常见的 try_files 行是

location / {
    try_files $uri $uri/ /test/index.html;
}

您可能了解第一部分,location /匹配所有位置,除非它与更具体的位置匹配,location /test例如

第二部分( the try_files)表示当您收到与此块匹配的 URI 时,$uri首先尝试,例如,http://example.com/images/image.jpgnginx 将尝试检查内部是否有一个文件/images被调用image.jpg,如果找到它将首先提供它。

第二个条件是$uri/如果你没有找到第一个条件$uri尝试将URI作为目录,例如http://example.com/images/,ngixn将首先检查一个名为的文件是否images存在然后它不会找到它,然后进入第二个检查$uri/并查看是否有一个目录称为images存在,然后它将尝试为它服务。

旁注:如果没有,autoindex on您可能会收到 403 禁止错误,因为默认情况下禁止列出目录

编辑:我忘了提到,如果你已经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,它将显示服务器错误等。

于 2013-07-23T01:31:58.947 回答