之前查看网站后台log,发现许多“apple-touch-icon-152×152.png”,“apple-touch-icon.png”类似的请求。从文件名推测是因为网站没有提供icon,于是iphone/ipad等设备的浏览器访问站点时发出特定icon请求。不想在log文件中看到这些报错避免,便在web根目录下touch了这类文件。
问题已经解决,事情到这里原本可以告一段落。然而几天前查看另外一个站点的log,看到了同样的提示。仔细查看错误,发现了新问题:web服务器用的Nginx,其中配置了静态文件直接处理,为什么会转发到后端PHP处理呢?
查看Nginx的转发规则,配置如下:
location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ { expires max; try_files $uri =404; } location ~ ^/assets/.*\.php$ { deny all; } location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/dev/shm/phpfpm.sock; try_files $uri =404; } location ~* /\. { deny all; } error_page 404 /404.html; location = /40x.html { }
配置看起来没毛病:指定后缀名的静态文件请求,文件存在则直接发送,不存在就跳转404页面;PHP请求则通过fastcgi的方式转发到后端PHP-FPM。
然而打脸的事实是,不存在的静态文件,例如/ccc.png,还是转发到了PHP端。这是怎么回事呢?
为了查找问题所在,首先将/段的规则改一下,当文件不存在时直接404。即进行如下配置:
location / { try_files $uri $uri/ =404; }
重启服务器后,发现运转正常,说明问题出在将请求转发到了PHP。
接着把PHP段的配置注释掉,再次访问,提示服务器错误。在Nginx的error日志上看到如下记录:
2017/05/27 10:44:28 [error] 6515#0: *919rewrite or internal redirection cycle while internally redirecting to "/404.html//////////", client: 10.0.2.2, server: , request: "GET /cccc.png HTTP/1.1", host: "localhost:8081"
看情况是404页面被多次重定向。再回顾配置,找到了问题的原因: 根据规则优先级,先匹配了 .png;Nginx去磁盘找文件,发现文件不存在就转到404;配置指定了404页面为 /404.html;接着处理/404.html,匹配到了 / 规则,于是出现了//404.html//////////的请求。
知晓了原因,问题就比较好解决了。一种办法是将规则中的 /40x.html 改成 /404.html;或者将error_page和 /40x.html的都注释掉,让Nginx处理404页面。
注释掉404的配置后,访问效果如图:
参考
- https://itlanyan.com/nginx-location-syntax/
发表回复