Из-за некоторых ужасных дизайнерских решений у нас есть приложение, которое не может отвечать на запросы HTTP HEAD (возвращает «Метод запрещен»). Модификация программного обеспечения для правильного возврата HEAD-запросов была бы сложной, не невозможной, но дополнительной работой. Приложение находится за прокси-сервером NGINX, мне было интересно, есть ли способ заставить NGINX преобразовывать запросы HEAD, полученные от клиентов, в запросы GET к бэкэнду, а затем отбрасывать ответ, кроме заголовков, и отправлять его обратно в клиент, как если бы наши серверы приложений могли отвечать на запросы HEAD.
Текущая конфигурация (достаточно стандартная)
upstream ourupstream{
server unix:/var/apps/sockets/ourapp.socket.thread1
server unix:/var/apps/sockets/ourapp.socket.thread2
server unix:/var/apps/sockets/ourapp.socket.thread3
[like 20 of these]
}
server {
listen 1.2.3.4:80;
server_name ourapp;
access_log /var/apps/logs/ourapp.nginx.plog proxy;
error_log /var/apps/logs/ourapp.nginx.elog info;
gzip on;
gzip_types text/plain text/html;
proxy_intercept_errors on;
proxy_connect_timeout 10;
proxy_send_timeout 10;
proxy_read_timeout 10;
proxy_next_upstream error timeout;
client_max_body_size 2m;
error_page 404 /static/404.html;
error_page 500 501 502 503 504 =500 /static/500.html;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://ourupstream/;
}
location /static/ {
root /var/apps/global/;
}
}
Поскольку вы используете proxy_pass, я думаю, вам придется использовать злоупотребление error_page (и, поскольку вы уже используете error_pages, вам также необходимо включить рекурсивные страницы ошибок). Я думаю, это сработает для вас:
upstream ourupstream{
server unix:/var/apps/sockets/ourapp.socket.thread1
server unix:/var/apps/sockets/ourapp.socket.thread2
server unix:/var/apps/sockets/ourapp.socket.thread3
[like 20 of these]
}
server {
listen 1.2.3.4:80;
server_name ourapp;
access_log /var/apps/logs/ourapp.nginx.plog proxy;
error_log /var/apps/logs/ourapp.nginx.elog info;
gzip on;
gzip_types text/plain text/html;
proxy_intercept_errors on;
proxy_connect_timeout 10;
proxy_send_timeout 10;
proxy_read_timeout 10;
proxy_next_upstream error timeout;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 2m;
error_page 404 /static/404.html;
error_page 500 501 502 503 504 =500 /static/500.html;
location @force_get {
recursive_error_pages on;
proxy_method GET;
proxy_pass http://ourupstream;
}
location / {
error_page 550 = @force_get;
if ($request_method = HEAD) { return 550; }
proxy_pass http://ourupstream;
}
location /static/ {
root /var/apps/global/;
}
}