nginx 404会执行302跳转

这个问题是应用中比较常见的一个问题了。尤其是对于静态文件,

一般而言在nginx中会利用error_page指令对一些错误吗指定错误页。此时,如果请求命中了改规则,就会跳转的响应的页面。比如:

error_page  400  404  500  'http://xxx.error.html' ;

上述的命令会导致302或301跳转。

一般的网站为了节省流量或者提高响应时间都会对静态文件做缓存,如果服务器返回304状态吗则会请求本地缓存的静态文件。一般而言,静态文件都会有一个Expires首部,表明该文件的过期时间。过期之后,才从服务器请求新资源,否则请求的都是本地缓存。

如 果请求一个不存在的静态文件,比如/test.css,此时就会导致error_page指令的跳转。但是要注意的是请求静态文件的请求是完整的,因此, 其中必然包含Expires首部,这就导致,即使已经存在了test.css文件,由于Expires的关系,还是会度本地的缓存,但是本地缓存有没有该 文件,导致请求一致处于302状态。

修改的方案就是,采用命令的location对error_page错误页指定的网页进行rewrite:如下所示:

error_page   400 404 @fb;
 
         location @fb {
             rewrite  ".*"  http: //xxx.error.html;
             break ;
         }

rewrite为请求的内部跳转(Internal rewrite),并且@fb中并没有设置Expires首部,因此就去掉了原请求中的Expires首部,从而避免前面提到的问题。

猜你喜欢

转载自zhengdl126.iteye.com/blog/2110795