如何配置位置块以始终在nginx中返回单个文件?


12

在我的应用程序中,我希望位置“ /”返回静态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任何地方使用指令。


你能try_files static/index_debug.html static/index_debug.html;
ceejayoz

@ceejayoz:尝试与location =/我一起获得404 NOT FOUND的建议,并location /得到500 INTERNAL SERVER ERROR。
Hubro

如果我没记错的话,您就错过了Index指令……任何网络服务器都会一直在寻找索引文件,并提供根URI(/),我认为您可以通过添加以下内容来覆盖它:location / { return 404; }
Martino Dino

@MartinoDino:为什么需要它?在哪
Hubro

location = / {Index /home/tomas/projects/streamcore/static/index_debug.html;}
Martino Dino

Answers:


10

刚刚测试过,它对我有用:

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,而我只得到静态页面。


0

您可以使用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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.