nginx-如何将自定义404页面的状态码也返回404

error_page用法

Syntax:error_page code ... [=[response]] uri;
Default:
Context:httpserverlocationif in location

(1)使用本地静态页面作为自定义404页面

Example

error_page 404             /404.html;
error_page 500 502 503 504 /50x.html;

此外,可以使用“ =response”语法将响应代码更改为另一个,例如:

error_page 404 =200 /empty.gif;

(2)如果在内部重定向期间不需要更改 URI 和方法,则可以将错误处理传递到命名位置:

location / {
    error_page 404 = @fallback;
}

location @fallback {
    proxy_pass http://backend;
}

#或者,二者均可

location / {
    error_page 404 = /error404.html;
}

location /error404.html {
    proxy_pass http://backend;
}

(3)也可以使用 URL 重定向进行错误处理:

error_page 403 http://example.com/forbidden.html; 
error_page 404 =301 http://example.com/notfound.html;

在这种情况下,默认情况下,响应代码 302 会返回给客户端。它只能更改为重定向状态代码之一(301、302、303、307 和 308)。

1.使用本地文件作为自定义404页面

Example

error_page 404 =/404.html;

则其状态码为200,和我们预期的404状态码不一致。

error_page 404 =/404.html  和 error_page 404 =200 /404.html返回的状态码是一样的,都是200。

可以直接修改配置为error_page 404 /404.html,将"="号去掉,其状态码会返回404。

error_page 404 /404.html 和 error_page 404 =404 /404.html的效果一致,返回状态码都是404.

2.使用url作为自定义404页面

Example

error_page 404 = https://example.com/404.html;

则其状态码为200,和我们预期的404状态码不一致。

但是和本地静态页面作为自定义404页面的例子不同。使用url作为自定义404页面的时候,及时将配置配成如下这样,其状态码还是200。

error_page 404 https://example.com/404.html;

并且无法通过 error_page 404 =404 https://example.com/404.html; 这样的配置将状态码修改为404。

因为官网文档给出,当只用url时,可指定的状态码只能是:301、302、303、307 和 308。

3.使用其他服务器上的静态页面作为自定义404页面

Example

location / {
    error_page 404 = @fallback;
}

location @fallback {
    proxy_pass http://backend;
}

#或者,二者均可

location / {
    error_page 404 = /error404.html;
}

location /error404.html {
    proxy_pass http://backend;
}

可以在业务转发的loaction中指定error_page 404 = 一个路径或者@xxxx

然后再通过location 404指定的path或者@xxx,通过proxy_pass转发到其他静态文件服务器。

如果需要内部重定向(修改路径),可以通过rewrite实现:

location / {
    error_page 404 /error404.html
}

location /error404.html {
    internal;
    rewrite .* /your-path/xx/404.html break;
    proxy_pass http://your_server_ip:port;
}

如果你的业务转发location中也是使用代理服务器或FastCGI服务器处理请求,则必须要配置如下参数才可以是的error_page生效。

#代理服务器
proxy_intercept_errors on;
#FastCGI服务器
fastcgi_intercept_errors on;

Example

#代理服务器

location / {
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_next_upstream http_502 http_504 http_503 error timeout invalid_header;
    proxy_pass http://your_server;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_intercept_errors on;
    error_page 404  = @fallback;

}


#FastCGI服务器
    location ~ \.php$ {
    fastcgi_pass php-upstream;
    fastcgi_index index.php;
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_read_timeout 600;
    include fastcgi_params;
    fastcgi_intercept_errors on;
    error_page 404 /error404.html;
}

参考文档

http://nginx.org/en/docs/http/ngx_http_core_module.html#error_pagehttp://nginx.org/en/docs/http/ngx_http_core_module.html#error_page

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值