为什么try_files指令在根和文件名之间缺少斜杠?

时间:2019-05-08 03:45:11

标签: nginx nginx-location

我正在尝试将Nginx设置为反向代理,但还要自己处理单个静态页面(问候):

root /usr/share/project/;
location = / {
    try_files index.html =404;
}

此配置始终返回404。当我试图弄清楚到底发生了什么时,我重写了try_files指令以使其失败:

try_files index.html index.html;

对于我在error.log中看到的内容感到惊讶:

  

2019/05/07 17:30:39 [错误] 9393#9393:* 1 open()“ /usr/share/projectindex.html”失败(2:无此类文件或目录),客户端:10.25。 88.214,服务器:,请求:“ GET /index.html HTTP / 1.1”

如您所见,结果文件名为projectindex.html。斜线错过了。我正在尝试在不同的位置添加/和./,但这并没有导致任何结果。

最后,我将配置替换为:

root /usr/share/project/;
location = / {
    try_files /index.html =404;
}
location = /index.html {
}

,并且有效。

我不明白第一个配置出了什么问题。而且我也不了解空位置的含义:

location = /index.html {
}

及其正常工作的原因。

也许有更好的方法可以做到这一点?

1 个答案:

答案 0 :(得分:1)

root可以选择尾随/-没关系,将被忽略。

try_files语句的 file 元素(与Nginx中的所有URI一样)都需要前导/。有关详细信息,请参见this document

例如:

root /usr/share/project;
location = / {
    try_files /index.html =404;
}
location / {
    proxy_pass ...;
}

之所以可行,是因为URI在内部被重写为/index.html,并且在相同的位置内处理。


如果使用index指令,则URI在内部被重写为/index.html,Nginx将搜索匹配的位置以处理请求。在这种情况下,您需要另一个位置来处理请求。

例如:

root /usr/share/project;
location = / {
    index index.html;
}
location = /index.html {
}
location / {
    proxy_pass ...;
}

空的位置块从外部块继承root的值。无论如何,index语句是默认值,因此严格来说,您也无需指定该语句。请注意,index指令的值不需要不需要前导/。有关详细信息,请参见this document