NGINX convertit les requêtes HEAD en GET

10

En raison de certaines décisions de conception terribles, nous avons une application incapable de répondre aux demandes HTTP HEAD (renvoie la «méthode non autorisée»). Modifier le logiciel pour renvoyer correctement les requêtes HEAD serait délicat, pas impossible mais un travail supplémentaire. L'application se trouve derrière un proxy NGINX, je me demandais s'il y avait un moyen d'obtenir NGINX pour convertir les requêtes HEAD reçues des clients en requêtes GET vers le back-end, puis ignorer la réponse à l'exception des en-têtes et la renvoyer à la client comme si nos serveurs d'applications étaient en mesure de répondre aux requêtes HEAD.

Configuration actuelle (assez 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/;
    }
}
Tache
la source
Comment transmettez-vous la demande au backend? proxy_pass? fastcgi_pass? Pouvez-vous coller votre configuration actuelle? Quelle version de nginx utilisez-vous?
kolbyjack
@kolbyjack proxy_pass utilisant des sockets unix, NGINX 1.1.12 et 1.0.11 en dev, 1.0.11 en production (nous passons bientôt à 1.1.12)
Smudge

Réponses:

5

Puisque vous utilisez proxy_pass, je pense que vous devrez faire un usage abusif de error_page (et puisque vous utilisez déjà error_pages, vous devrez également activer les pages d'erreur récursives). Je pense que cela fonctionnera pour vous:

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
la source
Cela semble toujours rendre le corps au client, même en cas de demande avec tête. Existe-t-il un moyen de supprimer / ignorer le contenu du corps?
Smudge
J'espérais qu'il se souviendrait que la demande d'origine était HEAD et laissait tomber le corps. Je ne peux pas penser à une autre façon d'y arriver, désolé.
kolbyjack
Eh bien, assez proche de ce dont nous avons besoin de toute façon
Smudge