<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CGI</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メタ変数</anchor> <dfn><code class="CGI" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SERVER_NAME</anchor></code></dfn> は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">クライアント</anchor>が接続してきた<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鯖</anchor>の名前 (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ドメイン名</anchor>または<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IPアドレス</anchor>) を表します。</p><section><h1>仕様書</h1><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[9]</anchor-end> <cite xml:lang="en">RFC 3875 - The Common Gateway Interface (CGI) Version 1.1</cite> (<time>2011-11-20 06:09:05 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://tools.ietf.org/html/rfc3875#section-4.1.14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI">http://tools.ietf.org/html/rfc3875#section-4.1.14</anchor-external></li></ul></refs></section><section><h1>値</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> 値の構文は次のように定義されています <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;9</anchor-internal></src>。<pre class="ABNF code">      SERVER_NAME = server-name
      server-name = hostname | ipv4-address | ( &quot;[&quot; ipv6-address &quot;]&quot; )</pre></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> この<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メタ変数</anchor>では <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IPv6アドレス</anchor>は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL</anchor> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">authority</anchor>
のように括弧で括って表されます。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> <code xmlns="http://www.w3.org/1999/xhtml" class="CGI" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">REMOTE_ADDR</anchor></code> では何も括らないのですが。 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Script-URI</anchor>
の定義との整合性を考えると確かに括弧が必要です。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鯖</anchor>は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">クライアント</anchor>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>してきた相手の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鯖</anchor>の名前をこの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メタ変数</anchor>に設定しなければ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><strong xmlns="http://www.w3.org/1999/xhtml">なりません</strong></anchor>
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;9</anchor-internal></src>。</p></section><section><h1>複数のホスト名がある場合、あるいは <code class="CGI" xml:lang="en">HTTP_HOST</code> との関係</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> 注意したいのは、仮想ホストも含めてサーバーで設定されている値と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP</anchor> の <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Host</anchor>:</code> 欄の値は異なる可能性があること。利用者の指定したサーバー名・ポート名を得たいなら <code>Host:</code> 欄の値が得られる変数 <code class="CGI">HTTP_HOST</code> を参照したほうがよいでしょう。 
<weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">(もっとも、 HTTP/1.0 の時代には <code xmlns="http://www.w3.org/1999/xhtml" class="HTTP">Host:</code> 欄は必須ではなかったので、この値は必ずしも得られるとは限りません。)</weak></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> Apache とかちゃんと考えてある鯖なら、
<code class="CGI">SERVER_NAME</code> はちゃんと
<weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">(仮想ホストの設定がどうであろうと)</weak>
意図している適当な名前が入っているはずです。</p><p>それとは別に、何らかの理由で別の鯖名で利用者が接続している時、
たとえば <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SSH</anchor> のポート転送機能を使って、
遠隔の鯖を <samp>localhost</samp> で接続していたりするちょっと変わった場合で、リンク先 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URI参照</anchor>を組み立てるために
<code class="CGI">SERVER_NAME</code> を使うと、
もともとの利用者が使っていた鯖名とは当然違うものになってしまいます。</p><p>こんな使い方はする方が悪いというか想定外なのが普通でありますが、
今のインターネットは<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">防火壁</anchor>とかであちこちが分断されているのが普通ですから、ちょっとくらい考えてあげてもばちはあたらないのではないでしょうか。幸い、
<code class="CGI">SERVER_NAME</code> + <code class="CGI">SERVER_PORT</code>
を使う代わりに <code class="CGI">HTTP_HOST</code>
を使うだけで解決できます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> おかしなホスト名でアクセスしてきた人がいたときに正しいホスト名になおして <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL</anchor>
を送りたいようなときは <code class="CGI" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SERVER_NAME</anchor></code> と <code class="CGI" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SERVER_PORT</anchor></code>
を組み合わせるのが良いでしょうし、できるだけ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者</anchor>のアクセスしてきた方法を尊重したいなら
<code class="CGI" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP_HOST</anchor></code> を使うのが良いのでしょうね。</p></section><section><h1>歴史</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> [COAR 03] では <code class="ABNF">SERVER_NAME = <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">hostname</anchor> | <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">hostnumber</anchor></code> としています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> [NCSA] が要求にかかわらずと述べたのは、要求にかかわらず同じ値という意味だと思われます。しかし現在では<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">仮想ホスト</anchor>がありますから、同じサーバーの同じ CGI script でも異なる値が提供されることがありえます。</p></section><section><h1>実装</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Apache</anchor> では <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ServerName</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">指令</anchor>で設定した値が得られます。</p></section><section><h1>関連</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> このメタ変数に関連して、 <code class="CGI"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SERVER_PORT</anchor></code> というポート番号の変数もあります。</p></section></body></html>