NGINX конвертувати HEAD в GET запити


10

Через деякі жахливі дизайнерські рішення, у нас є програма, яка не може відповісти на запити 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? fastcgi_pass? Чи можете ви вставити поточну конфігурацію? Яку версію nginx ви використовуєте?
колб'як

@kolbyjack proxy_pass, використовуючи unix-сокети, NGINX 1.1.12 та 1.0.11 в розробниках, 1.0.11 у виробництві (ми переходимо на виробництво незабаром до 1.1.12)
Smudge

Відповіді:


5

Оскільки ви використовуєте proxy_pass, я думаю, вам доведеться скористатися деякими зловживаннями сторінками помилок (а оскільки ви вже використовуєте сторінку_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/;
    }
}

Це все одно, здається, повертає тіло клієнту, навіть коли він просить голову. Чи є спосіб зняти / ігнорувати вміст тіла?
Мазок

Я сподівався, що пам’ятатиме, що оригінальним запитом було ГОЛОВА та скидання тіла. Я не можу придумати іншого способу зробити це, вибачте.
колб'як

Ну добре, чи достатньо близько до того, що нам все одно потрібно
Помазати
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.