nginx error_page
根据错误响应码返回对应的页面,或者指定响应码
error_page + notfound_uri
示例:
server {
listen 80;
server_name www.a.com;
root /data/nginx/domain1;
location ~ /images/ {
root /data/nginx/test1;
error_page 404 /notfound.html;
}
location / {
root /data/nginx/test;
error_page 404 /notfound.html;
}
}
首先在两个root目录下创建好notfound.html
echo "/data/nginx/images/notfound.html" > /data/nginx/images/notfound.html
echo "/data/nginx/test1/notfound.html" > /data/nginx/test1/notfound.html
然后在浏览器分别访问匹配两个root中不存在的a.html
www.a.com/a.html 匹配到
location / {
root /data/nginx/test;
error_page 404 /notfound.html;
}
响应
在浏览器访问时
http://www.a.com/images/a.html
匹配到
location ~ /images/ {
root /data/nginx/test1;
error_page 404 /notfound.html;
}
响应
可以看到虽然匹配到不通的localtion,但是响应同一个notfound.html。原因为当访问http://www.a.com/images/a.html uri=/images/a.html,返回404 此时 uri=/notfound.html 完整URL=http://www.a.com/notfound.html 所以会匹配到
location / {
root /data/nginx/test;
error_page 404 /notfound.html;
}
然后以/data/nginx/test/notfound.html进行响应。
为避免浏览器对错误页面拦截,可以指定响应码 例如 404 响应200 在两个location中加入
location / {
root /data/nginx/test;
error_page 404 =200 /notfound.html;
}
如图
error_page + location @
当部分服务升级访问某个页面报错,为了不影响客户体验,将该页面代理到未更新的服务器上。
配置如下图:
server {
listen 8080;
error_log /var/log/nginx/domain2_error.log;
location / {
root /data/nginx/domain2;
error_page 404 @fallback;
}
location @fallback {
proxy_pass http://192.168.243.129:8081;
}
}
准备工作,创建虚拟主机 192.168.243.129:8080 root目录,写入index.html 测试网站正常
创建 虚拟主机 192.168.243.129:8080 及其root目录 ,写入index.html 和a.html。
如下图所示
代表升级后的服务器
代表未升级的服务器
原a.html内容
在浏览器访问 http://192.168.243.129:8080/a.html
从图片中可以看出,虽然访问 http://192.168.243.129:8080/a.html报错404,但是页面跳转至192.168.243.129:8081/a.html 响应了正确的页面
为了不让客户感知这个错误,可以将错误码与后端服务器保持一致,配置为
server {
listen 8080;
error_log /var/log/nginx/domain2_error.log;
location / {
root /data/nginx/domain2;
error_page 404 = @fallback;
}
location @fallback {
proxy_pass http://192.168.243.129:8081;
}
}
~
效果如图
将错误定义到外部网站
当访问报错时,将页面跳转至外网,
配置如下:
server {
listen 8082;
location / {
root /data/nginx/domain4;
error_page 404 http://www.baidu.com;
}
}
访问 http://192.168.243.129:8082/a.html
只支持指定响应码的修改302 和301,其他的响应码修改后不生效
例如:
server {
listen 8082;
location / {
root /data/nginx/domain4;
error_page 404 =200 http://www.baidu.com;
}
}
再去访问,响应码依然为302
若指定为301
200:健康响应码
302: 临时重定向
301:永久重定向
304:使用浏览器的缓存未发生改变
404: 找不到页面
403: 没有权限,一般为nginx用户没有访问文件的权限