为什么 Nginx 接受根域之后的任何 URL 值?

为什么 Nginx 接受根域之后的任何 URL 值?

首次设置 Nginx,我的目标是使用极简配置为 example.com 提供静态“index.html”页面,仅此而已。我还想删除 www 子域。以下是我的站点可用服务器块:

server {
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

server {
    server_name example.com;
    root /var/www/example.com/;
    index index.html index.htm;

    location / {
            try_files $uri $uri/ /index.html;
    }
}

如果我使用 www.example.com 或 example.com,它们可以正常工作,并且 www 会自动删除。

我的问题是,我可以在 example.com 之后输入任何内容,而 index.html 页面仍然会加载,例如 example.com/ABC 或 example.com/12345。这些页面不存在,为什么这些 URL 会被接受?我预计除域根之外的任何 URL 都会返回 404 页面。

这可能是一个非常简单的问题,但我尝试在这里和文档中搜索,但目前还没有找到任何结果。

答案1

这似乎是 try_files 子句的正确行为。摘自 nginx wiki:

按顺序检查文件是否存在,并返回找到的第一个文件。结尾的斜杠表示目录 - $uri /。如果未找到文件,则调用内部重定向到最后一个参数。请注意,只有最后一个参数会导致内部重定向,前一个参数只会设置内部 URI 指针。

因此,如果您查找 ABC 或 12345,但找不到,则会调用到 index.html 的内部重定向。

尝试:

location / {
    try_files $uri $uri/ =404;
}

请参阅此处以获取完整参考:

http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files

根据 Martin Fjordvald 的评论以下是两个服务器块的最小配置,已经过测试并正常运行:

server {
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

server {
    server_name example.com;
    root /var/www/example.com/;
    index index.html index.htm;
}

答案2

我能想到的两件事:

要么你有一个重写规则回到index.html

或者你可能有一个自定义的 404 页面,该页面链接回 index.html

至少这是我首先要检查的两个想法。

其他可能的解决方案是检查日志,设置值进行调试并检查什么将您“重定向”回index.html,遗憾的是我对nginx不够了解,无法进一步帮助您。

相关内容