web-dev-qa-db-ja.com

nginxでのリダイレクト時のポート変更を防止

現在Varnishを介してコンテンツを提供するためにnginxを設定しています。 Nginxはポート8000​​でリッスンし、varnishはユーザーのリクエストを80から8000に接続します。

問題は、場合によっては、特にsite.com/2010などのディレクトリにアクセスしようとしたときに、nginxがリクエストをsite.com:8000/2010/にリダイレクトしていることです。

どうすればこれを防ぐことができますか?

8
arbales

HttpCoreModule docs をもっと注意深く読んで、この質問への答えを見つけました。

port_in_redirect off;

これにより、リダイレクト中にクライアントが使用するポートが保持されます。密接に関連しているのはserver_name_in_redirectリダイレクトに最初のホスト名を使用します。 sitename.v.myserver.comをsitename.comにリダイレクトしたくなかったので、

11
arbales

私の場合、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を使用したリダイレクトが心配な場合は、 このコメント を確認してください。

9
Luxian

NGINXの背後にあるコードは、おそらくFASTCGI変数SERVER_PORTを使用して、ユーザーをどこに誘導するかを決定します。 SERVER_PORTにはnginxがリッスンするポートが含まれるため、この場合は8000になります。

テストの目的で、次のようなことを試すことができます。

location ~ \.php$ {
        [...]
        fastcgi_param  SERVER_PORT 80;
}

あなたの構成に適応。これは汚いハックですが、問題の診断に役立ちます。

3
Julien Vehent

持っている人のために

  • Varnishはポート80をリッスンします
  • バックエンドサーバー(私の場合はnginx)がポート8080をリッスンします

fastcgi_param SERVER_PORTはフロントエンドと同じである必要があります。

だから、私は設定しました

fastcgi_param  SERVER_PORT 80;

nginxから適切なURLにリダイレクトします。

2
AnkitK