NGINX konwertuje żądania HEAD na GET

10

Z powodu niektórych okropnych decyzji projektowych aplikacja nie jest w stanie odpowiedzieć na żądania HTTP HEAD (zwraca „Metoda niedozwolona”). Modyfikacja oprogramowania w celu poprawnego zwracania żądań HEAD byłaby trudna, nie niemożliwa, ale dodatkowa praca. Aplikacja znajduje się za serwerem proxy NGINX. Zastanawiałem się, czy istnieje sposób na przekonanie NGINX do konwersji żądań HEAD otrzymanych od klientów na żądania GET do zaplecza, a następnie odrzuć odpowiedź z wyjątkiem nagłówków i odeślij ją z powrotem do klient, tak jakby nasze serwery aplikacji były w stanie odpowiedzieć na żądania HEAD.

Aktualna konfiguracja (dość standardowa)

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/;
    }
}
Plama
źródło
Jak przekazujesz żądanie do backendu? proxy_pass? fastcgi_pass? Czy możesz wkleić bieżącą konfigurację? Którą wersję nginx używasz?
kolbyjack
@kolbyjack proxy_pass przy użyciu gniazd unix, NGINX 1.1.12 i 1.0.11 w dev, 1.0.11 w produkcji (wkrótce przenosimy produkcję do 1.1.12)
Smudge

Odpowiedzi:

5

Ponieważ używasz proxy_pass, myślę, że będziesz musiał użyć pewnych nadużyć na stronach błędów (a ponieważ już używasz stron błędów, musisz także włączyć rekurencyjne strony błędów). Myślę, że to zadziała dla ciebie:

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/;
    }
}
kolbyjack
źródło
Nadal wydaje się to zwracać ciało klientowi, nawet na żądanie z głową. Czy istnieje sposób na usunięcie / zignorowanie treści?
Smudge
Miałem nadzieję, że pamięta, że ​​pierwotna prośba brzmiała HEAD i upuściła ciało. Przepraszam, nie mogę wymyślić innego sposobu, aby to się stało.
kolbyjack
No cóż, i tak jest wystarczająco blisko tego, czego potrzebujemy
Smudge