NGINX konvertiert HEAD in GET-Anforderungen

10

Aufgrund einiger schrecklicher Entwurfsentscheidungen kann eine Anwendung nicht auf HTTP-HEAD-Anforderungen antworten (Rückgabe 'Methode nicht zulässig'). Das Ändern der Software, um HEAD-Anforderungen korrekt zurückzugeben, wäre schwierig, nicht unmöglich, aber zusätzliche Arbeit. Die Anwendung befindet sich hinter einem NGINX-Proxy. Ich habe mich gefragt, ob es eine Möglichkeit gibt, NGINX dazu zu bringen, von Clients empfangene HEAD-Anforderungen in GET-Anforderungen an das Back-End zu konvertieren. Anschließend wird die Antwort mit Ausnahme der Header verworfen und an die gesendet Client, als ob unsere Anwendungsserver auf HEAD-Anfragen antworten könnten.

Aktuelle Konfiguration (ziemlich 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/;
    }
}
Verschmieren
quelle
Wie leiten Sie die Anfrage an das Backend weiter? proxy_pass? fastcgi_pass? Können Sie Ihre aktuelle Konfiguration einfügen? Welche Version von Nginx verwenden Sie?
Kolbyjack
@kolbyjack proxy_pass mit Unix-Sockets, NGINX 1.1.12 und 1.0.11 in dev, 1.0.11 in der Produktion (Wir verschieben die Produktion bald auf 1.1.12)
Smudge

Antworten:

5

Da Sie proxy_pass verwenden, müssen Sie wahrscheinlich einen Missbrauch von error_page verwenden (und da Sie bereits error_pages verwenden, müssen Sie auch rekursive Fehlerseiten aktivieren). Ich denke, das wird für Sie funktionieren:

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
quelle
Dies scheint den Körper immer noch an den Kunden zurückzugeben, selbst wenn dies mit dem Kopf angefordert wird. Gibt es eine Möglichkeit, den Körperinhalt zu entfernen / zu ignorieren?
Smudge
Ich hatte gehofft, es würde sich daran erinnern, dass die ursprüngliche Anfrage HEAD war und die Leiche fallen lassen. Ich kann mir keinen anderen Weg vorstellen, um das zu erreichen, sorry.
Kolbyjack
Na ja, kommt dem nahe, was wir sowieso brauchen
Smudge