web-dev-qa-db-ja.com

Nginxリバースプロキシリダイレクト

nginxをリバースプロキシとして使用しています。Webインターフェイスにログインすると、プロキシされたURLにリダイレクトされます。私はそれを避けて、常に「server_name」をURLとして保持したいと思います。出来ますか?

これは私の/etc/nginx/conf.d/my_app.confです:

server { 
    listen 443 ssl; 
    server_name my-app.net; 
    ssl_certificate /etc/pki/tls/certs/my-app.cer; 
    ssl_certificate_key /etc/pki/tls/private/my-app.key; 
    ssl_protocols TLSv1.1 TLSv1.2; 
    access_log /var/log/nginx/my-app.access.log main; 

    location / { 
        proxy_pass http://ip_of_the_app:7180/; 
        proxy_redirect off; 
    } 
} 

http://my-app.netに接続し、ログイン情報を入力すると、同じログインページでhttp://ip_of_the_app:7180にリダイレクトされ、再度ログインする必要があります。この二重ログインを回避できますか?

14
tonio94

proxy_redirectoffに設定しないでください。これは、想定していることを実行していません。 proxy_redirectは、URLの書き換えに似た処理を実行します。次に例を示します。

location /sales/ { 
    proxy_pass http://ip_of_the_app:7180/; 
    proxy_redirect http://ip_of_the_app:7180/ http://$Host/sales/; 
}

これにより、/sales/パスを別の場所でホストできます。しかし、それでも、proxy_redirectのデフォルトパラメータは、無料で正確に実行します。デフォルトでは、場所はproxy_passにあるものにリダイレクトされます(proxy_redirectをまったく設定しない場合、またはproxy_redirect default;を使用しない場合は、デフォルトのパラメーターが使用されます)。

proxy_redirectを設定する必要はありません。


不足しているのは、アプリに送信する必要があるヘッダーです。それらの中で最も重要なのはHostです。これにより、必要に応じてプロキシが実行され、ブラウザに正しいURLが保持されます。

location / { 
    proxy_pass http://ip_of_the_app:7180/; 
    proxy_set_header Host $Host;
}

http://ip_of_the_app:7180/のアプリがHost: my-app.netヘッダーを含むリクエストを受信することに注意してください。


また、さらにいくつかのヘッダーの使用を検討する必要があります。

proxy_set_header Referer $http_referer;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;

これにより、アプリ内のhttp://ip_of_the_app:7180/でのロギングが改善されます。 X-Forwarded-Forは、実際のクライアントのIP(nginxs IPではなく)を提供し、X-Forwarded-Protoは、クライアントがHTTPまたはHTTPSを介してnginxに接続したかどうかを確認します。

27
grochmal