最近遇到一个网站,是nginx环境,明明设置了404自定义页面,但是当打开这些不存在的页面时,全部跳转到首页,而不是打开这个设置的404页面。
我看网上也有很多人遇到这个问题,今天我就把这个原因说说。
有这个问题的网站nginx配置文件中都有这么几个句子
location / { try_files $uri $uri/ /?$args; }
引起这个问题的原因在于这里,因为在nginx中除了rewrite有重定向功能, nginx更为推崇的是try_files来执行重定向功能,因为rewrite会把所有的文件包括静态文件都重定向然后发送给php-fpm。
try_files $uri $uri/ /?$args;
这句话的意思就是查找文件$uri
是否存在,如果不存在就查找文件夹$uri/
是否存在,如果不存在就执行最后一个参数/?$args
,这个打开肯定就是设置的默认index文件了,这就是为何设置了404没有起作用而跳转到首页的原因。
那么解决办法也来了,就是在这里添加404判断。
location / { try_files $uri =404; try_files $uri $uri/ /?$args; }
或者直接加到一起
location / { try_files $uri $uri/ /?$args 404; }
try_files后面接参数也是可以的,如果前面的文件都不在,那么就执行404错误,也就是我们定制的404页面了。