nginx error_page 和 proxy_intercept_errors 指令,404错误页面跳转

最近网上看到这几篇完成,这里记录一下,分享给大家

 

nginx要自定义404和401的页面,但是error_page 配置没有生效,没有正常跳转。

 error_page 404  /404.html;

error_page 404 = http://www.test.com/error.html;

http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_module.html#error_page

这是因为我们的404静态资源在上游服务器上,而不是当前nginx直接提供

nginx proxy 启用自定义错误页面:

语法:proxy_intercept_errors on | off;

默认值:

proxy_intercept_errors off;

上下文:http, server, location

当被代理的后端服务器的响应状态码大于等于300时,决定是否直接将响应发送给客户端,亦或将响应转发给nginx由error_page指令来处理。

 proxy_intercept_errors 为on 表示 nginx按照原response code 输出,后端是404就是404。这个变量开启后,我们才能自定义错误页面。

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors

 

一、Nginx在Linux上设置404错误页面

 

  • Linux版本:Centos 7.4
  • Nginx版本:nginx-1.14.0.tar.gz
  • nginx安装目录参考: /usr/local/nginx则是我的安装目录

说明:我Linux服务器上已经在tomcat上部署了一个项目,使用Nginx进行的代理, 访问项目不存在的页面时,出现的是Nginx默认的404页面,现在我配置我自己写的404页面进行提示

注意:网上大多数博客写的都只有一种情况,要么就是使用 proxy_intercept_errors on;, 要么就是使用fastcgi_intercept_errors on; 没有说明这两种的区别, 还有也没有说明404.html文件应该放在服务器的什么位置。

我在此处优先进行说明:

1、如果你本地有部署项目,优先使用proxy_intercept_errors on;这个配置进行尝试,

2、如果没有部署项目,则使用fastcgi_intercept_errors on; 这个进行尝试,

3、也可以两个全加上, 其次404.html文件放在nginx安装目录的html文件夹下

1.1 第一种配置情况(跳转网络地址)

error_page配置的是http这种的网络地址

在http下配置 proxy_intercept_errors on;

http {
    include       mime.types;
    default_type  application/octet-stream;

    proxy_intercept_errors on;
    ... 以下省略

在server下配置 error_page 以下两种情况都可以起作用:

1、error_page 可以配置在server第一层的任何位置, 不受影响

2、error_page 也可以配置在location里面

我下面代码注释的地方都是可以配置的

  server {
        listen       80;
        server_name  www.xxxxxxx.com;
        #error_page  404  http://www.baidu.com;
        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
                        proxy_pass http://search-masteryee;
			proxy_set_header   REMOTE-HOST $remote_addr;
			proxy_set_header   Host $host; 
			proxy_set_header   X-Real-IP $remote_addr; 
			proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
			client_max_body_size    20m; 
			#error_page  404  http://www.baidu.com;
        }
		
	location /upload {
            root   /usr/;
            index  index.html index.htm;
        }
		
        error_page  404  http://www.baidu.com;
    }

1.2 第二种配置情况(跳转本地地址)

error_page配置的是本地服务器的页面地址,

  • 说明
  • 我的404.html页面文件放在nginx安装目录下的html文件夹内
  • 如果编写的404.html页面中有图片等外部文件,使用相对地址是不行的

在http下配置 proxy_intercept_errors on;

http {
    include       mime.types;
    default_type  application/octet-stream;

    proxy_intercept_errors on;
    ... 以下省略

在server中配置error_page 说明:我的nginx安装在/usr/local/下

    server {
        listen       80;
        server_name  www.xxxxxxx.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
                proxy_pass http://search-masteryee;
		proxy_set_header   REMOTE-HOST $remote_addr;
		proxy_set_header   Host $host; 
		proxy_set_header   X-Real-IP $remote_addr; 
		proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
		client_max_body_size    20m; 
        }
		
	location /upload {
            root   /usr/;
            index  index.html index.htm;
        }

        
	error_page   404  /404.html;
        location = /404.html {
            #使用绝对地址, 跳转服务器/usr/local/nginx/html/404.html
            root   /usr/local/nginx/html;
        }
        
        # 这种方式和上面的方式均可起作用,只需要选择一种即可,本文中没有进行进一步注释
        error_page   404  /404.html;
        location = /404.html {
            # 使用相对地址, 跳转nginx安装目录下的html/404.html
            root   html;
            # 下面这种多了一个/ 反而不起作用
            #root   /html;
        }
        
        # 以下这几种网上比较多的方式,均试过,无法跳转正确页面或不起跳转作用
        #error_page   404  404.html;
        #error_page   404  /404.html;
        #error_page   404  html/404.html;
        #error_page   404  /html/404.html;
        #error_page   404  /usr/local/nginx/html/404.html;
        #error_page   404  usr/local/nginx/html/404.html;
        
    }

可以配置多种返回码的多个错误页面,也可以同时配置多个错误码跳转一个页面,可以同时存在 如下所示

server {
        listen       80;
        server_name  www.xxxxxxx.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://search-masteryee;
			proxy_set_header   REMOTE-HOST $remote_addr;
			proxy_set_header   Host $host; 
			proxy_set_header   X-Real-IP $remote_addr; 
			proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
			client_max_body_size    20m; 
        }
		
	location /upload {
            root   /usr/;
            index  index.html index.htm;
        }

        #error_page  404	/404.html;
	# 错误页面的种类也可以是多个
		
	# 这里的错误码可以是多个
	error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        
        # 这里是错误吗也可以是一个
	error_page   404  /404.html;
        location = /404.html {
            root   html;
        }
    }

1.3 第三种情况(tomcat未启动时)

当我把我的tomcat服务器关掉时,我服务器就没有运行项目了,这时在访问页面,则上述配置没有产生效果,此时则需要添加一个配置 fastcgi_intercept_errors on;

在http下配置 fastcgi_intercept_errors on;

http {
    include       mime.types;
    default_type  application/octet-stream;

	fastcgi_intercept_errors on;
	proxy_intercept_errors on;
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #   

server中配置如下,将500 502 503 504等状态码一致性跳转404页面

server {
        listen       80;
        server_name  www.xxxxxxx.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
                        proxy_pass http://search-masteryee;
			proxy_set_header   REMOTE-HOST $remote_addr;
			proxy_set_header   Host $host; 
			proxy_set_header   X-Real-IP $remote_addr; 
			proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
			client_max_body_size    20m; 
        }
		
	location /upload {
            root   /usr/;
            index  index.html index.htm;
        }

        #error_page  404	/404.html;
		
	error_page   500 502 503 504  /404.html;
	error_page   404  /404.html;
        location = /404.html {
            root   html;
        }
    }

1.4 第四种情况(proxy_intercept_errors的配置地址可多样)

proxy_intercept_errors on;这个配置不一定需要放在http下面,也可以是server下,也可以是server的location下

server {
        listen       80;
        server_name  www.masteryee.com;
	proxy_intercept_errors on;
        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
                        proxy_pass http://search-masteryee;
			proxy_set_header   REMOTE-HOST $remote_addr;
			proxy_set_header   Host $host; 
			proxy_set_header   X-Real-IP $remote_addr; 
			proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
			client_max_body_size    20m; 
			#可以是这里
			#proxy_intercept_errors on;
        }
	location /upload {
            root   /usr/;
            index  index.html index.htm;
        }
		
	error_page   500 502 503 504  /404.html;
	error_page   404  /404.html;
        location = /404.html {
            root   html;
        }
       
    }

1.5 proxy_intercept_errors和fastcgi_intercept_errors的理解

配置proxy_intercept_errors on; 时配置的错误页面表示的是当服务器返回的状态码为我们配置的状态码时,我们才进行的页面跳转。如:服务器中没有xxxx.do接口时,我们访问了这个接口,配置了 proxy_intercept_errors on;则也会进行页面跳转

如果服务器中没有开启服务,则配置proxy_intercept_errors on; 无用,则需要再添加fastcgi_intercept_errors on; 配置, 这样的话,出现页面错误时也会进行跳转

 

Nginx自定义404页面3种方法

一个网站项目,肯定是避免不了404页面的,通常使用Nginx作为Web服务器时,有以下集中配置方式,一起来看看。

第一种:Nginx自己的错误页面

Nginx访问一个静态的html 页面,当这个页面没有的时候,Nginx抛出404,那么如何返回给客户端404呢?

看下面的配置,这种情况下不需要修改任何参数,就能实现这个功能。


server {
    listen      80;
    server_name  www.test.com;
    root   /var/www/test;
    index  index.html index.htm;

    location / {
    }

    # 定义错误页面码,如果出现相应的错误页面码,转发到那里。
    error_page  404 403 500 502 503 504  /404.html;

    # 承接上面的location。
    location = /404.html {
        # 放错误页面的目录路径。
        root   /usr/share/nginx/html;
    }
}

第二种:反向代理的错误页面

如果后台Tomcat处理报错抛出404,想把这个状态叫Nginx反馈给客户端或者重定向到某个连接,配置如下:

upstream www {
    server 192.168.1.201:7777  weight=20 max_fails=2 fail_timeout=30s;
    ip_hash;
}

server {
    listen       80;
    server_name www.test.com;
    root   /var/www/test;
    index  index.html index.htm;

    location / {
        if ($request_uri ~* ‘^/$’) {
            rewrite .*   http://www.test.com/index.html redirect;
        }

        # 关键参数:这个变量开启后,我们才能自定义错误页面,当后端返回404,nginx拦截错误定义错误页面
        proxy_intercept_errors on;

        proxy_pass      http://www;
        proxy_set_header HOST   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-FOR $proxy_add_x_forwarded_for;
    }

    error_page    404  /404.html;

    location = /404.html {
        root   /usr/share/nginx/html;
    }
}

第三种:Nginx解析php代码的错误页面

如果后端是php解析的,需要加一个变量

在http段中加一个变量 fastcgi_intercept_errors on 就可以了。

指定一个错误页面:

error_page    404  /404.html;

location = /404.html {
    root   /usr/share/nginx/html;
}

指定一个url地址:

error_page 404  /404.html;

error_page 404 = http://www.test.com/error.html;

 

参考:

https://cloud.tencent.com/developer/article/1488582

https://www.centos.bz/2017/08/nginx-custom-404-page/

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Nginxerror_page 配置用于设置错误页面的处理方式。可以使用 error_page 指令将特定的 HTTP 状态码映射到特定的错误页面。 语法: error_page 错误码 [= URL]; 例如: ``` error_page 404 /404.html; error_page 500 502 503 504 /50x.html; ``` 这样当服务器返回404状态码时,将会返回/404.html,当服务器返回500,502,503,504状态码时,将会返回/50x.html 请注意,错误页面文件必须在服务器上可用。 ### 回答2: 在Nginx中,error_page用于配置服务器遇到错误时的错误页面。具体来说,error_page指令用于定义当客户端请求的资源出现错误时所返回给客户端的页面或路径。 要配置error_page,首先需要在Nginx配置文件中指定所需的错误代码和对应的错误页面或路径。例如,以下是配置404错误的错误页面为/error/404.html的示例: ``` error_page 404 /error/404.html; ``` 在这个示例中,当服务器返回404错误时,将会将客户端重定向到/error/404.html页面。 除了简单的路径,error_page还支持其他形式的配置。例如,可以使用明确的URL来定义错误页面: ``` error_page 500 http://example.com/error/500.html; ``` 这个配置将会将500错误重定向到http://example.com/error/500.html页面。 还可以将错误页面配置为其他返回状态码的页面,例如400、503等。可以同时配置多个错误页面,Nginx会按照配置的顺序查找并使用第一个匹配的错误页面。 通过配置error_page,可以在服务器遇到错误时返回适当的错误页面,提高用户体验和处理错误的可视化。 ### 回答3: 在Nginx中,可以通过配置error_page来指定自定义的错误页面。error_page指令允许当服务器出现特定错误时指定一个自定义页面来替代默认的错误页面。 配置error_page的语法如下: ``` error_page code [target]; ``` code是需要自定义错误页面的错误码,可以是一个具体的错误码(如404),也可以是一个错误码的范围(如400-499表示所有的客户端错误)。 target是指定自定义错误页面的路径。路径可以是一个本地路径,也可以是一个远程URL。 例如,如果想指定404错误的自定义页面为`/var/www/html/404.html`,可以在Nginx的配置文件中添加如下配置: ``` error_page 404 /404.html; ``` 这样,当出现404错误时,Nginx会显示`/var/www/html/404.html`作为错误页面。 另外,可以通过配置多个error_page来指定不同错误码对应的不同自定义页面。例如: ``` error_page 404 /404.html; error_page 500 502 /50x.html; ``` 这样,当出现404错误时,会显示`/404.html`作为错误页面;当出现500或502错误时,会显示`/50x.html`作为错误页面。 需要注意的是,当指定了自定义错误页面后,Nginx会优先显示自定义页面,如果没有指定自定义页面或自定义页面不存在,才会显示默认的错误页面。 综上所述,通过配置error_page,可以方便地指定自定义错误页面,提供更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值