[1] 【[[CGI]]】 サーバーの[[ホスト名]], [[DNS]] 別名, あるいは [[IPv4アドレス]]が設定される[[メタ変数]]/[[環境変数]]です。 この名前は、自身を参照する [[URL]] があるとしたらその中に含まれるものです。 [[CGI/1.1]] ではこの変数を要求にかかわらず必ず提供しなければなりません。 * 仕様書 [REFS[ - [9] [CITE@en[RFC 3875 - The Common Gateway Interface (CGI) Version 1.1]] ([TIME[2011-11-20 06:09:05 +09:00]] 版) ]REFS] * 複数のホスト名がある場合、あるいは [CODE(CGI)@en[HTTP_HOST]] との関係 [5] 注意したいのは、仮想ホストも含めてサーバーで設定されている値と [[HTTP]] の [CODE(HTTP)[[[Host]]:]] 欄の値は異なる可能性があること。利用者の指定したサーバー名・ポート名を得たいなら [CODE[Host:]] 欄の値が得られる変数 [CODE(CGI)[HTTP_HOST]] を参照したほうがよいでしょう。 [WEAK[(もっとも、 HTTP/1.0 の時代には [CODE(HTTP)[Host:]] 欄は必須ではなかったので、この値は必ずしも得られるとは限りません。)]] [7] Apache とかちゃんと考えてある鯖なら、 [CODE(CGI)[SERVER_NAME]] はちゃんと [WEAK[(仮想ホストの設定がどうであろうと)]] 意図している適当な名前が入っているはずです。 それとは別に、何らかの理由で別の鯖名で利用者が接続している時、 たとえば [[SSH]] のポート転送機能を使って、 遠隔の鯖を [SAMP[localhost]] で接続していたりするちょっと変わった場合で、リンク先 [[URI参照]]を組み立てるために [CODE(CGI)[SERVER_NAME]] を使うと、 もともとの利用者が使っていた鯖名とは当然違うものになってしまいます。 こんな使い方はする方が悪いというか想定外なのが普通でありますが、 今のインターネットは[[防火壁]]とかであちこちが分断されているのが普通ですから、ちょっとくらい考えてあげてもばちはあたらないのではないでしょうか。幸い、 [CODE(CGI)[SERVER_NAME]] + [CODE(CGI)[SERVER_PORT]] を使う代わりに [CODE(CGI)[HTTP_HOST]] を使うだけで解決できます。 [8] おかしなホスト名でアクセスしてきた人がいたときに正しいホスト名になおして [[URL]] を送りたいようなときは [CODE(CGI)@en[[[SERVER_NAME]]]] と [CODE(CGI)@en[[[SERVER_PORT]]]] を組み合わせるのが良いでしょうし、できるだけ[[利用者]]のアクセスしてきた方法を尊重したいなら [CODE(CGI)@en[[[HTTP_HOST]]]] を使うのが良いのでしょうね。 * 歴史 [2] [COAR 03] では [CODE(ABNF)[SERVER_NAME = [[hostname]] | [[hostnumber]]]] としています。 [3] [NCSA] が要求にかかわらずと述べたのは、要求にかかわらず同じ値という意味だと思われます。しかし現在では[[仮想ホスト]]がありますから、同じサーバーの同じ CGI script でも異なる値が提供されることがありえます。 * 実装 [4] [[Apache]] では [CODE[[[ServerName]]]] [[指令]]で設定した値が得られます。 * 関連 [6] このメタ変数に関連して、 [CODE(CGI)[[[SERVER_PORT]]]] というポート番号の変数もあります。