我如何强制nginx服务自定义的404页面,同时响应404头,而不改变浏览器的地址,以便用户可以轻松地重新键入?
set $allowed 0; #(updated after comments) error_page 404 /404page.html; #(updated after first answer, forgot to mention) location = /authreq.html { if ($allowed = 0){ # return 307 $scheme://$host/404page.html ; #works but should be 404 # return 404 "shows this message"; #does not redirect when inserting url instead of message # rewrite ^ /404page.html break; #serves 404page.html and doesn't change browseraddress which is good, but sends a response header 200 # return 404 # invokes error_page directive with header 200 } }
整个configuration:
server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; server_name www.fellowshipmedia.eu; server_name localhost; root /usr/share/nginx/html; index index.php index.html index.htm; error_page 404 = /404page.html; set $allowed 0; location = /authreq.html { if ($allowed = 0){ # return 307 $scheme://$host/404page.html ; #works but should be 404 # return 404 "shows this message"; #does not redirect when inserting url instead of message return 404; # # rewrite ^ /404page.html break; #serves 404page.html and doesn't change browseraddress which is good, but sends a response header 200 } } }
error_page指令不会为你做这个吗?
比如像这样的东西:
server { ... error_page 404 /404page.html; ... location = /authreq.html { if ($allowed = 0){ return 404; } } }
简单地做下面的事情不会返回一个404头,而是一个200:
server { ... error_page 404 /404page.html; ... location = /authreq.html { if ($allowed = 0){ return 404; } } }
要调用404头并提供自定义404页面而不更改浏览器的地址栏地址,您应该在error_page指令中添加“404”,如下所示:
error_page 404 =404 /404page.html;