Nginxの変数$ host、$ http_host、および$ server_nameの違いは何ですか?


42

3つのnginxの変数の違いは何ですか$host$http_hostとは$server_name

私はどちらを使用する必要があるかわからない書き換えルールを持っています:

location = /vb/showthread.php {
    # /vb/showthread.php?50271-What-s-happening&p=846039
    if ($arg_p) {
        return 301 $scheme://$host/forum/index.php?posts/$arg_p/;
        }

「書き換えルールで___変数を使用する」だけでなく、それらの理論的な違いを説明する答えを探しています。


後で指定する必要さえなく$scheme$host... return 301 /forum/index.php?posts/$arg_p/;正常に動作することに気付きました。
ジェフウィドマン

ほとんどのブラウザーはリダイレクトで相対URLを使用しますが、標準(w3.org/Protocols/rfc2616/rfc2616-sec14.html)ではLocationヘッダーに絶対URLが必要です。
クトゥルフ

回答:


54

$host他の変数のいずれかのセマンティクスが特に必要な場合を除き、ユーザーエージェントの動作に関係なく賢明なものを持つことが保証されている唯一のものであるため、ほとんど常に使用する必要があります。

違いはnginxのドキュメントで説明されています

  • $host 「この優先順位で:要求行からのホスト名、または 'Host'要求ヘッダーフィールドからのホスト名、または要求に一致するサーバー名」
  • $http_host HTTP "Host"ヘッダーフィールドのコンテンツが含まれています(リクエストに含まれている場合)
  • $server_nameserver_namenginx設定で定義されているように、リクエストを処理した仮想ホストのが含まれます。serverに複数server_nameのが含まれている場合、最初の1つだけがこの変数に存在します。

ユーザーエージェントがHost:ヘッダーではなくリクエスト行でホスト名を送信することは合法であるため、プロキシに接続する場合を除いてめったに行われないため、これを考慮する必要があります。

また、ユーザーエージェントがホスト名をまったく送信しない場合も考慮する必要があります。たとえば、古代のHTTP / 1.0リクエストや現代の不適切なソフトウェアです。複数のWebサイトにサービスを提供している場合、またはサーバーに単一のWebサイトしかない場合は、単一の仮想ホストを介してすべてを処理する可能性があります。 。後者の場合、これも考慮する必要があります。

$host変数のみが、HTTPリクエストを形成するときにユーザーエージェントが行う可能性のあるすべてのことを説明します。


2
一方、UAのフィールドに任意のコンテンツが含まれる$server_name場合は、安全Host:です。
クトゥルフ

1
$ http_hostは$ hostnameに名前変更されますか?Nginx docでそのような変数を見つけることができません。$ hostnameは、私が推測する最も類似したものです。
darkbaby123

3
@ darkbaby123いいえ、名前は何にも変更されていません。ドキュメントを参照してください。
マイケルハンプトン

1
これで、http_ <name>変数の意味がわかりました。ありがとうございました!
darkbaby123

0

受け入れられた回答に記載されていない別の重要なポイントを追加したいと思います。

$hostNOTながら、ポート番号を持っている$http_hostDOは、ポート番号が含まれます。

編集:常にではありません。

ヘッダー「add_header Y-blog-http_host "$ http_host" always;」を設定します

次にcurl -I -L domain.com:80(または443)、ヘッダーにポート番号がまったく表示されません。nginx-extra 1.10.3で検証済み。それは、一般的なhttp(s)ポートまたはnginx設定だからですか?このコメントは、物事が常にあなたの考えた通りに振る舞うとは限らない、と言うだけです。


0

私もこれにしばらく苦労しました。$ http_XXXXXが宣言されたすべてのヘッダー変数を参照していることがわかったときに明らかになりました。

したがって、$ http_user_agent、$ http_refererは、「USER AGENT」、「REFERER」が小文字とアンダースラッシュで参照されます。これは、多くのNGINX構成サンプルで地獄$ http_upgradeがどこから来たのかを説明してくれました。

https://stackoverflow.com/questions/15414810/whats-the-difference-of-host-and-http-host-in-nginxからお読みください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.