我学会了如何让NGINX返回503
客户错误页面,但我不知道如何做到以下几点:
示例configuration文件:
location / { root www; index index.php; try_files /503.html =503; } error_page 503 /503.html; location = /503.html { root www; }
正如你所看到的,根据上面的代码,如果在我的根目录中find一个名为503.html
的页面,站点将把这个页面返回给用户。
但是 ,似乎虽然上面的代码有效,当有人只是访问我的网站打字
它不捕获像这样的请求:
通过我的代码,用户仍然可以看到index.php
以外的任何其他页面。
问题是:
如何将请求捕获到我网站中的所有页面,并在我的根文件夹中存在503.html
时将其转发到503.html
?
更新 :将“if -f”更改为“try_files”。
尝试这个:
server { listen 80; server_name mysite.com; root /var/www/mysite.com/; location / { try_files /maintenance.html $uri $uri/ @maintenance; # When maintenance ends, just mv maintenance.html from $root ... # the rest of your config goes here } location @maintenance { return 503; } }
更多信息:
https://serverfault.com/questions/18994/nginx-best-practices
下面的配置适用于接近最新的稳定的nginx 1.2.4
。 我找不到一个方法来启用一个维护页面,而不使用if
但显然根据IfIsEvil这是一个好的, if
。
touch /srv/sites/blah/public/maintenance.enable
。 你可以rm
文件禁用。 502
将被映射到503
,这是大多数人想要的。 你不想给Google一个502
。 502
和503
页。 您的应用程序将生成其他错误页面。 网络上还有其他的配置,但他们似乎并没有在最新的nginx上工作。
server { listen 80; server_name blah.com; access_log /srv/sites/blah/logs/access.log; error_log /srv/sites/blah/logs/error.log; root /srv/sites/blah/public/; index index.html; location / { if (-f $document_root/maintenance.enable) { return 503; } try_files /override.html @tomcat; } location = /502.html { } location @maintenance { rewrite ^(.*)$ /maintenance.html break; } error_page 503 @maintenance; error_page 502 =503 /502.html; location @tomcat { client_max_body_size 50M; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header Referer $http_referer; proxy_set_header X-Forwarded-Proto http; proxy_pass http://tomcat; proxy_redirect off; } }
其他答案都是正确的,但只是补充一点,如果你使用内部代理,你还需要添加proxy_intercept_errors on;
在您的一个代理服务器上。
所以例如…
proxy_intercept_errors on; root /var/www/site.com/public; error_page 503 @503; location @503 { rewrite ^(.*)$ /scripts/503.html break; }