【问题标题】:How can I make this try_files directive work?我怎样才能使这个 try_files 指令起作用?
【发布时间】:2013-07-21 19:55:39
【问题描述】:

我想了解 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;
    }

【问题讨论】:

  • try_files 行中的尾随 / 是什么意思?
  • 表示回退选项是一个“/”。 “;”前面的字符在那一行。
  • 嗯,它需要是一个文件,而不是一个 URI,所以使用 $uri/ 或使用 /index.html
  • $uri/ 可能也不起作用,因为我们不在一个位置,它在服务器块中,你到底想做什么,所以我可以帮你写它,比如服务@ 987654329@那如果处理不正常呢?
  • @Jonah 我认为 try_files 指令的上下文是位置而不是服务器。

标签: nginx


【解决方案1】:

可以根据您的情况应用的非常常见的 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中是否有一个名为@987654329的文件@如果找到它会首先提供它。

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

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

编辑:我忘了说如果你定义了index,nginx 会尝试检查索引是否存在于这个文件夹中 尝试目录列表。

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

如果第三个条件也失败了,那么 nginx 将提供 404 错误页面。

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

location @error {
}

您可以像这样使用try_files 调用它

try_files $uri $uri/ @error;

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

location /images {
    try_files $uri =404;
}

这意味着要么提供文件,要么提供 404 错误,你不能在没有 =404 的情况下单独使用 $uri,因为你需要有一个后备选项。
您还可以选择您想要的错误代码,例如:

location /images {
    try_files $uri =403;
}

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

【讨论】:

  • 感谢您的解释。具体来说,我的 OP 中的代码有什么问题?我能够通过将 try_files 放在位置块中并使用命名的后备来使其工作。位置块之外是否不允许使用 try_files 指令?还是在我的 OP 代码中的问题是回退是“/”?
  • 好的,我刚刚检查了文档wiki.nginx.org/HttpCoreModule#try_files,显然它可以在位置块之外工作,所以我想问题是你没有后备选项。
  • 这个解释很有帮助!
  • 你确定第二个条件是http://example.com/images/ 而不是http://example.com/images/image.jpg/ 吗?
  • 您是对的,但在第二个示例中,我的意思是当您尝试http://example.com/images 时,images 将首先作为文件尝试,然后作为目录尝试。我会尽量让这个更清楚一点,谢谢
猜你喜欢
  • 2013-05-06
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 2018-01-21
相关资源
最近更新 更多