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

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

在我的应用程序中,我希望位置“/”返回静态 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_filesHTTP 代码(例如 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并提供服务。

相关内容