У меня есть веб-сервер, который предназначен для возврата 503 для всего содержимого, кроме запросов значков. Это отказоустойчивый сервер, которому назначен более низкий приоритет для балансировщиков нагрузки. В случае, если все серверы внутренних приложений отключены, запросы будут переполняться на этот веб-сервер, обслуживая 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
Это происходит потому, что вы указали именованный location
в error_page
. В этом случае метод запроса не изменяется, а передается этому location
во внутреннем редиректе. Таким образом, он эффективно пытается выполнить POST в статический файл. Таким образом, вы получаете 405, потому что nginx не может выполнить POST в статический файл, чтобы получить желаемый error_page
. (Это действительно предназначено для использования, когда страница с ошибкой будет динамически генерироваться некоторым веб-приложением.)
Если вы просто хотите предоставлять статический контент для всех таких запросов, укажите нужный документ прямо в error_page
а не названный location
.