NGINX, HEAD'i GET isteklerine dönüştürüyor


10

Bazı korkunç tasarım kararları nedeniyle, HTTP HEAD isteklerine yanıt veremeyen bir uygulamamız var ('Yöntem İzin Verilmez' iadesi). Yazılımın HEAD isteklerini doğru bir şekilde döndürmesi için değiştirilmesi zor, imkansız değil, fazladan bir iş olacaktır. Uygulama bir NGINX proxy arkasında oturuyor, müşteriden gelen HEAD isteklerini GET isteklerine arka uca dönüştürmek için NGINX almanın bir yolu olup olmadığını merak ettim, sonra başlıklar hariç yanıtı atın ve geri gönderin istemcimiz, uygulama sunucularımız HEAD isteklerine yanıt verebiliyormuş gibi.

Mevcut yapılandırma (oldukça standart)

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

İsteği arka uca nasıl iletiyorsunuz? proxy_pass? fastcgi_pass? Mevcut yapılandırmanızı yapıştırabilir misiniz? Hangi nginx sürümünü kullanıyorsunuz?
kolbyjack

@kolbyjack proxy_pass unix soketleri kullanarak, nginx 1.1.12 ve dev 1.0.11, 1.0.11 üretimde (Yakında 1.1.12'de için üretime taşıyoruz)
Leke

Yanıtlar:


5

Proxy_pass kullandığınızdan, bazı hata_sayfa kötüye kullanımları kullanmanız gerektiğini düşünüyorum (ve zaten error_pages kullandığınız için, yinelemeli hata sayfalarını da etkinleştirmeniz gerekir). Bunun sizin için çalışacağını düşünüyorum:

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

Bu, kafa ile talep edildiğinde bile vücudu müşteriye geri döndürüyor gibi görünüyor. Vücut içeriğini soymanın / görmezden gelmenin bir yolu var mı?
Leke

Orijinal isteğin HEAD olduğunu ve vücudu düşürdüğünü umuyordum. Bunu yapmanın başka bir yolunu düşünemiyorum, üzgünüm.
kolbyjack

Oh şey, biz yine gerekenleri yakın yeterince yapar
Smudge
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.