$ 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;
}
}
しかし、ここでの問題は、そのルートが常に優位であることです。プロキシはどちらの方法でも渡されません。
これをどのように達成できるかについてのアイデアはありますか?
前もって感謝します
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/
を削除します。
これを試して:
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;
}
}