在Nginx中针对POST请求返回503错误状态码

7

我有一个简单的配置文件,用于在维护期间提供自定义503错误页面。其中关键部分如下:

server {
    listen      80 default;
    root        /usr/share/nginx/html;
    server_name example.com;

    location / {
        if (-f $document_root/503.json) {
            return 503;
        }
    }

    # error 503 redirect to 503.json
    error_page 503 @maintenance;
    location @maintenance {
        rewrite ^(.*)$ /503.json break;
    }
}

问题在于Nginx会确定任何请求都是静态文件,而POST、PUT和DELETE请求则会得到405(不允许的方法)响应。
因此问题是:如何告诉Nginx对于任何HTTP方法都提供我的页面?

1
你想到解决办法了吗? - Tuukka Mustonen
2个回答

9
我今天遇到了这个问题。看起来问题是由于nginx(像大多数服务器一样)不允许您向静态文件POST。解决方法是在@503位置块中捕获405错误,并提供维护页面。此外,您还需要启用@recursiveerrorpages@,因为您首先有意地引发了503错误,然后用户通过向您的静态文件发送POST请求而引发了405错误:
recursive_error_pages on;

if (-f $document_root/system/maintenance.html) {
  return 503;
}

error_page 404 /404.html;
error_page 500 502 504 /500.html;
error_page 503 @503;
location @503 {

  error_page 405 = /system/maintenance.html;

  # Serve static assets if found.
  if (-f $request_filename) {
    break;
  }

  rewrite ^(.*)$ /system/maintenance.html break;
}

来源:https://www.onehub.com/blog/2009/03/06/rails-maintenance-pages-done-right/

在IT技术领域中,维护页面是一项非常重要的任务。当您需要对网站进行更新或修复时,为了避免用户受到影响,您可以使用维护页面来提供有用的信息和解释。本文将介绍如何在Rails框架中正确地创建维护页面。


在这种情况下,返回给POST请求的状态码仍然是405,对吗? - Mohamed Hafez
@MohamedHafez 不是的,它应该返回503。在链接的源文章中已经完全解释了这一点,但从记忆中来看,它会重定向到维护页面,然后明确地抛出一个503。 - Jay
很遗憾,对于我来说,这也会重定向到浏览器URL上的维护页面。我一整天都在尝试重写而不是重定向。 - Michael Rogers
它为error_page抛出了无效参数异常。我按照Nginx手册中的状态重定向方式添加了error_page 405 =503 /mymaintenancepage.html;,之后它就正常运行了。 - JustAMartin

0
也许尝试强制将405请求作为实际URI:
error_page 405 = $uri;

不确定您的意思。实际URI结果为405。我想要503。 - cababunga
如果它能正常工作,请查看以下内容 error_page 405 =503 /50x.html; - Salem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接