6

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

4

2 回答 2

8

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

解决方案是在 @503 位置块中捕获 405 错误,为维护页面提供服务。此外,您必须启用@recursiveerrorpages@,因为您首先故意抛出 503 错误,然后用户通过发布到您的静态文件来抛出 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/

于 2015-04-23T07:09:59.160 回答
0

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

error_page 405 = $uri;
于 2013-04-24T00:15:21.563 回答