在 Nginx 中为 POST 请求返回 503

Posted

技术标签:

【中文标题】在 Nginx 中为 POST 请求返回 503【英文标题】:Return 503 for POST request in Nginx 【发布时间】:2013-04-17 08:27:18 【问题描述】:

我有一个简单的配置文件,用于在维护时提供自定义 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】:

我今天遇到了这个。似乎问题是由于 nginx(像大多数服务器一样)不允许您 POST 访问静态文件。

解决方案是在您的@503 位置块中捕获 405 错误,提供 维护页面。此外,您必须启用 @recursiveerrorpages@,因为你是第一个故意抛出一个 503 错误,然后用户通过发布到您的 静态文件:

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/

【讨论】:

在这种情况下返回到 post 请求的状态码在这种情况下仍然是 405,对吗? @MohamedHafez 不,它应该返回 503。它在链接的源文章中进行了充分解释,但从内存中它重定向到维护页面,然后显式抛出 503 遗憾的是,这也为我重定向到浏览器 url 上的维护页面。我整天都在尝试重写而不是重定向。 它为error_page 抛出了无效参数异常。我添加了状态重定向,如 nginx 手册:error_page 405 =503 /mymaintenancepage.html; 然后它工作正常。【参考方案2】:

也许尝试将 405 请求强制为实际 URI:

error_page 405 = $uri;

【讨论】:

不确定你的意思。实际 URI 结果为 405。我想要 503。 看看这个是否有效 error_page 405 =503 /50x.html;

以上是关于在 Nginx 中为 POST 请求返回 503的主要内容,如果未能解决你的问题,请参考以下文章

Nginx下HTML页面POST请求静态JSON数据返回405状态

nginx返回状态码

nginx返回状态码

curl 使用 POST 方法工作,但获取 API 返回错误 503

节点 JS 发布请求导致 Heroku 严重错误请求超时 (503)

有没有人遇到nginx做代理,get请求有效,post请求是404