Nginx 405 未使用指定的 error_page(静态内容)

Nginx 405 未使用指定的 error_page(静态内容)

我有一个 Web 服务器,设计为对除图标请求之外的所有内容返回 503。这是一台故障转移服务器,在负载平衡器上设置为较低优先级。如果后端应用服务器全部离线,请求将溢出到此 Web 服务器上,提供 503 和一些静态内容,以对服务中断表示歉意。

对于 GET 请求,它工作正常。但是,当向服务器发送 PUT/POST 请求时,它返回 405 默认响应。

以下是我的配置片段:

# FILE: nginx.conf
daemon off;
pid /hab/svc/sorry-web/var/pid;
worker_processes auto;

events {
  worker_connections 512;
}
http {
  rewrite_log on;

  # Temporary files
  client_body_temp_path /hab/svc/sorry-web/var/client-body;
  fastcgi_temp_path /hab/svc/sorry-web/var/fastcgi;
  proxy_temp_path /hab/svc/sorry-web/var/proxy;
  scgi_temp_path /hab/svc/sorry-web/var/scgi_temp_path;
  uwsgi_temp_path /hab/svc/sorry-web/var/uwsgi;

  # Mime Types
  include /hab/svc/sorry-web/config/mime.types;

  server_tokens off;
  more_clear_headers Server;
  server_names_hash_bucket_size 256;

  variables_hash_max_size 8192;
  variables_hash_bucket_size 512;

  # GZip
  gzip on;
  gzip_http_version 1.1;
  gzip_comp_level 2;
  gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;

  # Default server
  include /hab/svc/sorry-web/config/default_server;
}
# FILE: default_server.conf
server {
  listen 7003 default_server;
  server_name _;
  error_page 405 502 503 504 =503 @content;
  root /hab/pkgs/sorry/sorry-web/0.3.0/20200803032212/htdocs/default/busy;
  location @content {
    try_files $uri /index.html =404;
  }
  location / {
    try_files __force_503__.html =503;
  }
  include /hab/svc/sorry-web/config/favicon.conf;
}

POST 请求的响应如下:

# curl -vvv -XPOST http://localhost:7003/something
*   Trying 127.0.0.1:7003...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 7003 (#0)
> POST /something HTTP/1.1
> Host: localhost:7003
> User-Agent: curl/7.68.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 405 Not Allowed
< Date: Mon, 03 Aug 2020 03:22:41 GMT
< Content-Type: text/html
< Content-Length: 154
< Connection: keep-alive
< 
<html>
<head><title>405 Not Allowed</title></head>
<body>
<center><h1>405 Not Allowed</h1></center>
<hr><center>openresty</center>
</body>
</html>
* Connection #0 to host localhost left intact

答案1

location发生这种情况是因为您在 中指定了一个名称error_page。在这种情况下,请求方法不会改变,而是location通过内部重定向传递给该方法。因此,它实际上是在尝试 POST 到静态文件。因此,您会得到 405,因为 nginx 无法 POST 到静态文件以获取所需的error_page。(这实际上适用于某些 Web 应用程序将动态生成错误页面的情况。)

如果您只是想为所有此类请求提供静态内容,请直接指向所需的文档,error_page而不是命名的location

相关内容