我怎样才能使这个try_files指令工作?

Jon*_*nah 48 nginx

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

但是,我有一个简单的html页面位于文件系统中/var/www/test/index.html.以下配置文件未导致该文件被提供.我想理解为什么不这样做,以及我需要做出哪些改变才能实现.

这是defualt.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;
    }
Run Code Online (Sandbox Code Playgroud)

Moh*_*ady 176

一个非常常见的try_files行,可以应用于你的条件是

location / {
    try_files $uri $uri/ /test/index.html;
}
Run Code Online (Sandbox Code Playgroud)

您可能理解第一部分,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将首先检查一个名为imagesexists 的文件是否存在然后它找不到它,然后进行第二次检查$uri/,看看是否有一个目录调用images存在然后它将尝试服务它.

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

编辑:我忘了提到,如果你已经index定义,nginx将尝试在尝试目录列表之前检查该文件夹中是否存在索引.

第三个条件/test/index.html被认为是一个后退选项,(你需要使用至少2个选项,一个和一个后退),你可以尽可能多地使用(之前从未读过收缩),nginx会在index.html里面查找文件文件夹test,如果存在则提供服务.

如果第三个条件也失败,则nginx将提供404错误页面.

还有一些叫做命名的位置,就像这样

location @error {
}
Run Code Online (Sandbox Code Playgroud)

你可以把它try_files像这样

try_files $uri $uri/ @error;
Run Code Online (Sandbox Code Playgroud)

提示:如果您只想提供1个条件,例如内部文件夹,images您只想提供图像或转到404错误,您可以写一个像这样的行

location /images {
    try_files $uri =404;
}
Run Code Online (Sandbox Code Playgroud)

这意味着要么提供文件服务,要么提供404错误,你不能只$uri使用它自己,=404因为你需要有一个后备选项.
您还可以选择所需的错误代码,例如:

location /images {
    try_files $uri =403;
}
Run Code Online (Sandbox Code Playgroud)

如果图像不存在,这将显示禁止的错误,或者如果您使用500,它将显示服务器错误等.

  • 这个解释非常有用! (4认同)