SERVER_NAME

メタ変数 SERVER_NAME (CGI)

[1] CGIメタ変数 SERVER_NAME は、 クライアントが接続してきたの名前 (ドメイン名またはIPアドレス) を表します。

仕様書

[10] 値の構文は次のように定義されています >>9

      SERVER_NAME = server-name
      server-name = hostname | ipv4-address | ( "[" ipv6-address "]" )

[11] このメタ変数では IPv6アドレスURLauthority のように括弧で括って表されます。

[12] REMOTE_ADDR では何も括らないのですが。 Script-URI の定義との整合性を考えると確かに括弧が必要です。

[13] クライアント要求してきた相手のの名前をこのメタ変数に設定しなければなりません >>9

複数のホスト名がある場合、あるいは HTTP_HOST との関係

[5] 注意したいのは、仮想ホストも含めてサーバーで設定されている値と HTTPHost: 欄の値は異なる可能性があること。利用者の指定したサーバー名・ポート名を得たいなら Host: 欄の値が得られる変数 HTTP_HOST を参照したほうがよいでしょう。 (もっとも、 HTTP/1.0 の時代には Host: 欄は必須ではなかったので、この値は必ずしも得られるとは限りません。)

[7] Apache とかちゃんと考えてある鯖なら、 SERVER_NAME はちゃんと (仮想ホストの設定がどうであろうと) 意図している適当な名前が入っているはずです。

それとは別に、何らかの理由で別の鯖名で利用者が接続している時、 たとえば SSH のポート転送機能を使って、 遠隔の鯖を localhost で接続していたりするちょっと変わった場合で、リンク先 URI参照を組み立てるために SERVER_NAME を使うと、 もともとの利用者が使っていた鯖名とは当然違うものになってしまいます。

こんな使い方はする方が悪いというか想定外なのが普通でありますが、 今のインターネットは防火壁とかであちこちが分断されているのが普通ですから、ちょっとくらい考えてあげてもばちはあたらないのではないでしょうか。幸い、 SERVER_NAME + SERVER_PORT を使う代わりに HTTP_HOST を使うだけで解決できます。

[8] おかしなホスト名でアクセスしてきた人がいたときに正しいホスト名になおして URL を送りたいようなときは SERVER_NAMESERVER_PORT を組み合わせるのが良いでしょうし、できるだけ利用者のアクセスしてきた方法を尊重したいなら HTTP_HOST を使うのが良いのでしょうね。

歴史

[2] [COAR 03] では SERVER_NAME = hostname | hostnumber としています。

[3] [NCSA] が要求にかかわらずと述べたのは、要求にかかわらず同じ値という意味だと思われます。しかし現在では仮想ホストがありますから、同じサーバーの同じ CGI script でも異なる値が提供されることがありえます。

実装

[4] Apache では ServerName 指令で設定した値が得られます。

関連

[6] このメタ変数に関連して、 SERVER_PORT というポート番号の変数もあります。