NGINX converte HEAD in richieste GET


10

A causa di alcune terribili decisioni di progettazione, un'applicazione non è in grado di rispondere alle richieste HTTP HEAD (Restituisce "Metodo non consentito"). Modificare il software in modo che restituisca correttamente le richieste HEAD sarebbe complicato, non impossibile ma richiede un lavoro extra. L'applicazione si trova dietro un proxy NGINX, mi chiedevo se c'era un modo per ottenere NGINX per convertire le richieste HEAD ricevute dai client in richieste GET al back-end, quindi scartare la risposta ad eccezione delle intestazioni e rispedirla al client come se i nostri server applicazioni fossero in grado di rispondere alle richieste HEAD.

Configurazione attuale (abbastanza standard)

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/;
    }
}

Come stai passando la richiesta al backend? proxy_pass? fastcgi_pass? Riesci a incollare la tua configurazione attuale? Quale versione di nginx stai eseguendo?
kolbyjack,

@kolbyjack proxy_pass utilizzando socket unix, NGINX 1.1.12 e 1.0.11 in sviluppo, 1.0.11 in produzione (stiamo trasferendo presto la produzione all'1.12.12)
Smudge

Risposte:


5

Dal momento che stai usando proxy_pass, penso che dovrai fare un po 'di abuso di error_page (e dato che stai già usando error_page, dovrai anche abilitare le pagine di errore ricorsive). Penso che questo funzionerà per te:

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/;
    }
}

Questo sembra ancora restituire il corpo al client, anche quando richiesta con la testa. Esiste un modo per eliminare / ignorare il contenuto del corpo?
Sfumare l'

Speravo che ricordasse che la richiesta originale era HEAD e lasciava cadere il corpo. Non riesco a pensare a un altro modo per farlo accadere, scusa.
kolbyjack,

Oh beh, fa abbastanza vicino a ciò di cui abbiamo bisogno comunque
Sfumino
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.