nginx404错误页面指向
平时因为公司的站点经常会配置到nginx的默认错误页面指向,以前只看到通过下面的方法进行配置:
1server
2{
3 listen 80;
4 server_name www.abc.com;
5 index index.html index.htm index.php;
6 root /opt/wwwroot;
7 error_page 500 502 404 /errorpage/404.html;
8 #下面内容省略
9}
但是我的404页面里因为有图片加载,显示的是红叉叉。通过查看源代码,发现图片指向的是/opt/wwwroot路径,而图片放置的目录在/errorpage目录里。如果通过rewrite配置肯定是可以实现的图片显示的,这是毫无疑问的。不过每次如果因为几个图片就非得去写rewrite岂不是很麻烦。于是我大胆的设想他能不能支持直接url指向。于是我的配置方件改成下面的:
1server
2{
3 listen 80;
4 server_name www.abc.com;
5 index index.html index.htm index.php;
6 root /opt/wwwroot;
7 error_page 500 502 404 http://www.abc.com/errorpage/404.html;
8 #下面内容省略
9}
测试配置文件ok,再重新reload配置文件,发现之前的红叉叉显示成了图片。OK,susuccessful !
2013-4-20之再看nginx error_page参数:
在对公司站点进行新一轮的优化时,发现了一个问题:同样都配置了error_page ,但两个不同的页面报的错不一样,一个是直接返回的是nginx的默认错误页,而另一个报的是指向的错误页。为了快速定位出错的原因,首先理了下公司web的访问路由,不外乎如下两种:
其一,nginx ——> squid ——–> nginx ——–> 静态文件 ;
其二,nginx ——-> nginx ———> tomcat 。
通过对两者nginx的对比,得出如下结论:决定error_page页面展现的有四个因素 ————— 前端nginx配置,后端nginx配置,error_page使用相对路径,error_page使用URL 。当请求到达后端nginx时,返回的错误由后端返回。这时前端的配置就显的无关重要,而达不到后端时,返回的错误就由前端nginx返回 。
所以如果前端nginx只是做转发用的,强烈建议将其error_page页面配置成URL ,这样就不会造成error_page找不到相关页面而报最原始的错误(不过此处有一个问题,就是返回的http_code 不会是404、503之类的,不便于定位问题,而且不会显示出错页面的URL而直接跳转到像www.361way.com/errorpage.html之样的定义页面上);
而后端强烈建议使用相对路径的页面,这样一但页面出错,还原显示原出错http_code ,而且访问的出错地址也不会是301或302跳转的错误页的URL (如:www.361way.com/aaa.html出错,还是停留在该URL界面,而内容是error_page的内容)。
而为了分析问题,解决上面提到的前端nginx返回error_page的问题,可以让其在出错URL后面跟上错误代码和请求的URL,这样便于数据分析,一目了解是那个页面出错,http_code是什么 。具体调整为如下:
1error_page 500 502 503 404 http://www.test.com/errorpage/error.html?t=$status&u=$host$request_uri;
这样再错时就会在error_page后面显示http_code 和出错页面 。
注:动态页面不生效时(如 php),需要配置在nginx里增加配置:fastcgi_intercept_errors on;
参考页面
http://wiki.nginx.org/HttpCoreModule#error_page
http://bbs.linuxtone.org/thread-6848-1-1.html
http://www.fising.cn/2011/09/自定义-nginx-404-error-page-相关问题.shtml
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/nginx-404/1299.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.