我正在尝试将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 {
}
及其正常工作的原因。
也许有更好的方法可以做到这一点?
答案 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。