NGINXはHEADをGETリクエストに変換します


10

ひどい設計上の決定が原因で、HTTP HEADリクエストに応答できないアプリケーションがあります( 'Method Not Allowed'を返します)。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、2012年

UNIXソケットを使用する@kolbyjack proxy_pass、開発ではNGINX 1.1.12および1.0.11、本番では1.0.11(本番は1.1.12に間もなく移行します)
1

回答:


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

これは、ヘッドでリクエストした場合でも、クライアントにボディを返すようです。ボディコンテンツを削除/無視する方法はありますか?
1

元々のリクエストがHEADだったことを思い出して遺体を落として欲しいと思っていました。それを実現する別の方法は考えられません。
kolbyjack

まあ、とにかく私たちが必要とするものに十分近づいています
Smudge
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.