現在Varnishを介してコンテンツを提供するためにnginxを設定しています。 Nginxはポート8000でリッスンし、varnishはユーザーのリクエストを80から8000に接続します。
問題は、場合によっては、特にsite.com/2010
などのディレクトリにアクセスしようとしたときに、nginxがリクエストをsite.com:8000/2010/
にリダイレクトしていることです。
どうすればこれを防ぐことができますか?
HttpCoreModule docs をもっと注意深く読んで、この質問への答えを見つけました。
port_in_redirect off;
これにより、リダイレクト中にクライアントが使用するポートが保持されます。密接に関連しているのはserver_name_in_redirect
リダイレクトに最初のホスト名を使用します。 sitename.v.myserver.comをsitename.comにリダイレクトしたくなかったので、
私の場合、nginxはDockerコンテナー内のポート80
をリッスンしていますが、コンテナーの外部のポート8080
(または任意のランダムポート)にマップされています。ポートの適切なヘッダーを追加でき、nginx構成でハードコードしたくないリバースプロキシはありません。
間違ったリダイレクトの例:
http://localhost:8080/directory -> http://localhost/directory/
私は試した:
server {
# ...
port_in_redirect off;
server_name_in_redirect off;
# ...
}
しかし、うまくいきませんでした。うまくいった唯一のものは:
server {
# ...
absolute_redirect off;
# ...
}
手動入力 absolute_redirect
は言う:
無効にすると、nginxによって発行されるリダイレクトは相対的になります。
これはより柔軟で、サーバー名とポートをどこにでもハードコーディングする必要はありません。
相対URLを使用したリダイレクトが心配な場合は、 このコメント を確認してください。
NGINXの背後にあるコードは、おそらくFASTCGI変数SERVER_PORTを使用して、ユーザーをどこに誘導するかを決定します。 SERVER_PORTにはnginxがリッスンするポートが含まれるため、この場合は8000になります。
テストの目的で、次のようなことを試すことができます。
location ~ \.php$ {
[...]
fastcgi_param SERVER_PORT 80;
}
あなたの構成に適応。これは汚いハックですが、問題の診断に役立ちます。
持っている人のために
fastcgi_param SERVER_PORTはフロントエンドと同じである必要があります。
だから、私は設定しました
fastcgi_param SERVER_PORT 80;
nginxから適切なURLにリダイレクトします。