首次设置 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不够了解,无法进一步帮助您。