2011-04-08 215 views
10

我学会了如何让NGINX返回503客户错误页面, 但我不能找出如何做到以下几点:如何在NGINX中设置自定义503错误页面?

示例配置文件:

location/{ 
     root www; 
     index index.php; 
     try_files /503.html =503; 
    } 

    error_page 503 /503.html; 
    location = /503.html { 
     root www; 
    } 

正如你所看到的,根据上面的代码中,如果在我的根目录中找到一个名为503.html的页面,则该站点会将此页面返回给用户。

看来,虽然上面的代码工作,当有人简单地访问我的网站键入

它没有陷阱的请求,如:

通过我的代码,用户仍然可以看到除index.php以外的任何其他页面。

问题:

我如何陷阱请求在我的网站的所有网页,并将其转发给503.html每当503.html存在于我的根文件夹?

回答

6

更新:将“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

http://wiki.nginx.org/HttpCoreModule#try_files

+0

try_files是最好的做法。此外,它不会丢失。它只是不完整。 – ASPiRE 2011-04-09 19:49:30

+0

@Vini没有失踪和不完整之间的区别是什么,对我来说它是一样的。我更新了示例以包含try_files而不是if -f。希望有所帮助。 – 2011-04-09 21:32:27

+0

谢谢Ken。顺便说一句,$ uri做什么?我连续两次看到它。 – ASPiRE 2011-04-10 02:40:58

5

下面的配置适用于接近最新的稳定nginx的1.2.4。 我找不到使用if启用维护页面的方法,但显然根据IfIsEvil这是一个好的if

  • 启用维护touch /srv/sites/blah/public/maintenance.enable。您可以rm禁用该文件。
  • 错误502将映射到503这是大多数人想要的。你不想给Google一个502
  • 定制502503页面。您的应用程序将生成其他错误页面。

网络上还有其他配置,但他们似乎没有在最新的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; 
    } 
} 
+0

谢谢你。如果不使用'if',我也找不到方法。很高兴看到这是一个可以接受的使用! – 2013-09-18 16:32:41

3

其他的答案都是正确的,但我想补充的是,如果你使用内部代理你还需要在你的代理服务器的一个补充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; 
    }