平时因为公司的站点经常会配置到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