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

@kolbyjack proxy_pass โดยใช้ซ็อกเก็ตยูนิกซ์, NGINX 1.1.12 และ 1.0.11 in dev, 1.0.11 ในการผลิต (เรากำลังจะย้ายการผลิตไปที่ 1.1.12 เร็ว ๆ นี้)
Smudge

คำตอบ:


5

เนื่องจากคุณใช้ proxy_pass ฉันคิดว่าคุณจะต้องใช้ error_page การละเมิด (และเนื่องจากคุณใช้ error_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/;
    }
}

สิ่งนี้ยังดูเหมือนว่าจะส่งคืนเนื้อความไปยังไคลเอนต์แม้เมื่อมีการร้องขอด้วยหัวหน้า มีวิธีใดที่จะตัด / เพิกเฉยต่อเนื้อหาของร่างกายหรือไม่
รอยเปื้อน

ฉันหวังว่ามันจะจำได้ว่าคำขอเดิมคือส่วนหัวและวางร่างกาย ฉันไม่สามารถคิดถึงวิธีอื่นที่จะทำให้มันเกิดขึ้นขอโทษ
kolbyjack

โอ้ดีอยู่ใกล้กับสิ่งที่เราต้องการอยู่แล้ว
เปื้อน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.