NGINX mengonversi HEAD ke GET permintaan

10

Karena beberapa keputusan desain yang mengerikan, kami memiliki aplikasi yang tidak dapat menanggapi permintaan HEAD HTTP (Pengembalian 'Metode Tidak Diizinkan'). Memodifikasi perangkat lunak untuk mengembalikan permintaan KEPALA dengan benar akan sulit, bukan tidak mungkin tetapi kerja ekstra. Aplikasi ini berada di belakang proxy NGINX, saya bertanya-tanya apakah ada cara untuk mendapatkan NGINX untuk mengonversi permintaan HEAD yang diterima dari klien menjadi permintaan GET ke back-end, kemudian membuang respons kecuali untuk header dan mengirimkannya kembali ke klien seolah-olah server aplikasi kami dapat menanggapi permintaan HEAD.

Konfigurasi saat ini (cukup standar)

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/;
    }
}
Noda
sumber
Bagaimana Anda menyampaikan permintaan ke backend? proxy_pass? fastcgi_pass? Bisakah Anda menempelkan konfigurasi Anda saat ini? Versi nginx mana yang Anda jalankan?
kolbyjack
@kolbyjack proxy_pass menggunakan soket unix, NGINX 1.1.12 dan 1.0.11 di dev, 1.0.11 di produksi (Kami akan segera memindahkan produksi ke 1.1.12)
Smudge

Jawaban:

5

Karena Anda menggunakan proxy_pass, saya pikir Anda harus menggunakan penyalahgunaan error_page (dan karena Anda sudah menggunakan error_pages, Anda juga harus mengaktifkan halaman kesalahan rekursif). Saya pikir ini akan bekerja untuk Anda:

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
sumber
Ini tampaknya masih mengembalikan tubuh ke klien, bahkan ketika permintaan dengan kepala. Apakah ada cara untuk menghapus / mengabaikan konten tubuh?
Smudge
Saya berharap akan ingat bahwa permintaan asli adalah KEPALA dan menjatuhkan tubuh. Saya tidak bisa memikirkan cara lain untuk mewujudkannya, maaf.
kolbyjack
Oh well, cukup dekat dengan apa yang kita butuhkan
Smudge