error_page用法
Syntax: | error_page |
---|---|
Default: | — |
Context: | http , server , location , if 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;
}