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

第一次设置Nginx,我的目标是让example.com带有一个静态的'index.html'页面,并以最低限度的configuration提供服务。 我也想删除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自动下降。

我的问题是我可以input任何东西后example.com和index.html页面仍然加载,如example.com/ABC或example.com/12345。 这些网页不存在,为什么url被接受? 我希望除域根以外的任何URL都可以返回404页面。

这可能是一个非常简单的问题,但我试着在这里和文档中search,到目前为止我没有提到任何东西。

这似乎是try_files子句的正确行为。 从nginx维基:

按顺序检查文件的存在,并返回find的第一个文件。 尾部的斜线表示一个目录 – $ uri /。 在没有find文件的情况下,调用到最后一个参数的内部redirect。 请注意,只有最后一个参数会导致内部redirect,前者只是设置内部URI指针。

因此,如果您查找无法find的ABC或12345,则会调用内部redirect到index.html。

试试:

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

在这里寻找一个完整的参考:

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

根据Martin Fjordvald的评论,这里是两个服务器模块的最小configuration,testing和工作:

 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; } 

我能想到的两件事情:

要么你有一个rewriterule回到index.html

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

至less这将是我第一次检查的两个想法。

其他可能的解决scheme将检查日志,设置值进行debugging,并检查什么“redirect”你回到index.html可悲的是我不知道nginx足够好,以进一步协助您。