在我的应用程序中,我希望位置“/”返回静态 index.html 文件,我希望“/static”从文件夹中提供静态文件,我希望所有其他请求都返回 404 NOT FOUND。稍后我将把所有其他请求重定向到 WSGI 服务器。
这是目前我的配置:
# Dev server.
server {
listen 1337;
charset UTF-8;
location / {
rewrite ^ static/index_debug.html break;
}
location /static {
alias /home/tomas/projects/streamcore/static;
}
}
静态文件夹运行正常,但“/”返回 404 NOT FOUND。我还尝试过:
alias /home/tomas/projects/streamcore/static/index_debug.html;
在位置块中,但返回 500 INTERNAL SERVER ERROR。它似乎alias
不喜欢单个文件。此外,我还尝试过:
try_files static/index_debug.html;
但是这会阻止服务器启动,并出现错误“try_files 指令中的参数数量无效”。显然try_files
实际上需要您尝试多个文件,这不是我想要的行为。
我的问题是:那么如何配置位置块以始终返回静态文件?
编辑:我从其他答案中看到alias
确实应该接受单个文件作为参数,所以我尝试:
location = / {
alias /home/tomas/projects/streamcore/static/index_debug.html;
}
但我仍然只收到 500 INTERNAL SERVER ERROR。“/”请求的错误日志显示:
[警报] 28112#0:*7“/home/tomas/projects/streamcore/static/index_debug.htmlindex.html”不是目录
为什么它尝试打开“index_debug.htmlindex.html”?我没有index
在任何地方使用该指令。
答案1
刚刚测试过这个并且对我有用:
server {
root /tmp/root;
server {
listen 8080;
location /static {
try_files $uri =404;
}
location / {
rewrite ^ /static/index_debug.html break;
}
}
}
该文件/tmp/root/static/index_debug.html
当然存在:)
我可以点击任意 URL 都只会得到静态页面。
答案2
您可以使用try_files
HTTP 代码(例如 404)作为第二个参数:
try_files /static/index_debug.html =404;
注意前导斜杠。
完整的示例如下所示(不需要重写):
# Dev server.
server {
listen 1337;
charset UTF-8;
root /home/tomas/projects/streamcore/;
location / {
try_files /static/index_debug.html =404;
}
}
答案3
您可以使用 try_files 并通过重写重定向到指定位置。如下所示:
server {
root /tmp/root;
server {
listen 8080;
location / {
try_files $uri $uri/ @index;
}
location @index {
rewrite ^ static/index_debug.html break;
}
}
}
如果文件存在,/tmp/root
则会提供服务,否则 uri 将被重写static/index_debug.html
并提供服务。