web-dev-qa-db-ja.com

nginx条件付きプロキシパス

$ request_body変数が特定の正規表現に一致する場合にのみ、リクエストを別のサーバーにプロキシで渡すようにnginxを設定しようとしています。

私の今の問題は、この動作を正確に構成する方法がないことです。

私は現在これにダウンしています:

server {
    listen 80 default;
    server_name test.local;

    location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header Host $http_Host;

            if ($request_body ~* ^(.*)\.test) {
                    proxy_pass http://www.google.de;
            }

            root /srv/http;
    }

}

しかし、ここでの問題は、そのルートが常に優位であることです。プロキシはどちらの方法でも渡されません。

これをどのように達成できるかについてのアイデアはありますか?

前もって感謝します

23
sharpner

Nginxルーティングは、リクエストURIに一致するロケーションディレクティブに基づいています。解決策は、要求をさまざまなエンドポイントに転送するために、これを一時的に変更することです。

server {
    listen 80 default;
    server_name test.local;

     if ($request_body ~* ^(.*)\.test) {
         rewrite ^(.*)$ /istest/$1;
     }

     location / {
         root /srv/http;
     }

     location /istest/ {
        rewrite ^/istest/(.*)$  $1 break;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $http_Host;
        proxy_pass http://www.google.de;

    }
}

if条件は、その一部である rewrite module を使用してNginxでのみ安全に使用できます。この例では。 rewriteは、リクエストURIの前にistestを付けます。

locationブロックは、最も近い一致を優先します。 /istest/に一致するものはすべて、2番目のブロックに移動し、別のrewriteを使用して、上流URIに転送する前にリクエストURIから/istest/を削除します。

2
Steve E.

これを試して:

server {
    listen 80 default;
    server_name test.local;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $http_Host;

        if ($request_body ~* ^(.*)\.test) {
            proxy_pass http://www.google.de;
            break;
        }

        root /srv/http;
    }

}
18
user973254