我正在摆弄一台服务器,并将其中一个子域设置为不总是运行的服务的代理。server
块如下所示:
server {
server_name servlet.example.org;
error_page 502 /error/down.html;
location / {
proxy_pass http://127.0.0.1:12510;
proxy_redirect default;
proxy_intercept_errors on;
}
location /error/ {
root /path/to/servlet;
autoindex off;
}
}
/path/to/servlet/error/down.html
当服务中断时,这可以满足任何请求,这很棒。
我的问题是,我想让任何外部请求都/error/
返回 403 状态代码,并带有自己的自定义错误页面(例如forbidden.html
,也可以在文件夹中找到)/error/
。该internal
指令听起来像是我想要的,但它返回 404。我不能只用将整个服务器上的 404 错误覆盖为 403 error_page
,因为服务可能会返回自己的 404,我想保留它。
这可能吗?我该怎么做?我尝试过看似有意义的组合,internal
但error_page
毫无进展。
除此之外,我至少可以为任何在 中会显示 404 的网站提供 403 吗/error/
?例如down.html
和forbidden.html
会正常显示,但其他网站会显示 403 并显示forbidden.html
。
答案1
我无法让服务器在/error/
外部将所有内容都设置为 403,但我设法做到了亚军:将所有其他不可用的内容都设置为 403。
我必须使用 rewrite 才能使其工作,因为如果没有它,对 nginx 的/error/
单独请求将给出默认的 nginx 错误消息,而不是自定义的错误消息。我仍然无法弄清楚。
server {
server_name servlet.example.org;
error_page 502 /error/down.html;
error_page 403 /error/forbidden.html; # other error_pages for the
error_page 404 /error/notfound.html; # proxy's output
# ...
location / {
proxy_pass http://127.0.0.1:12510;
proxy_redirect default;
proxy_intercept_errors on;
}
location = /error/ { # did you request /error/ ?
rewrite .* /error/x last; # not anymore!
} # we can also omit autoindex now
location /error/ {
root /path/to/servlet;
error_page 404 =403 /error/forbidden.html;
}
}