[15] [[CGI]] の[[メタ変数]] [DFN[[CODE(CGI)@en[[[REMOTE_ADDR]]]]]] は、
[[クライアント]]の[[IPアドレス]]を表します。

* 仕様書
[REFS[
- [21] [CITE@en[RFC 3875 - The Common Gateway Interface (CGI) Version 1.1]]
-- [14] '''<http://tools.ietf.org/html/rfc3875#section-4.1.8>'''
-- [22] <http://tools.ietf.org/html/rfc3875#section-8.2>
]REFS]

* 値

[16] [[鯖]]は [CODE(CGI)@en[[[REMOTE_ADDR]]]] [[メタ変数]]の値を[[クライアント]]の[[ネットワーク番地]]に設定しなければ[['''なりません''']] [SRC[>>14]]。

[17] 構文は次の通りです [SRC[>>14]]。
[PRE(ABNF code)[
      REMOTE_ADDR  = hostnumber
      hostnumber   = ipv4-address | ipv6-address
      ipv4-address = 1*3digit "." 1*3digit "." 1*3digit "." 1*3digit
      ipv6-address = hexpart [ ":" ipv4-address ]
      hexpart      = hexseq | ( [ hexseq ] "::" [ hexseq ] )
      hexseq       = 1*4hex *( ":" 1*4hex )
]PRE]

;; [18] この定義は [[IPv4アドレス]]や[[IPv6アドレス]]の本来の構文よりかなり緩い定義です。
仕様上、[[IPv6アドレス]]については [[RFC 3513]] の参照がありますが、 [[IPv4アドレス]]については明記されていません。

[23] この値は[[串]]を挟む場合などに最終的な受信者になるとは限らないことに注意が必要です。
[SRC[>>22]] その場合 [CODE(HTTP)@en[[[X-Forwarded-For:]]]] ([CODE(CGI)@en[[[HTTP_X_FORWARDED_FOR]]]])
を使うのが一般的です。

[4] [CODE(perl)@en[HTTP::Request::AsCGI]] は [CODE(CGI)@en[REMOTE_ADDR]]
を常に [CODE[127.0.0.1]] とします。

* 歴史

[1] [NCSA]:

> The IP address of the remote host making the request. 

その[[要求]]を作った遠隔ホストの
IP アドレス。

[2] [COAR 03]:

> The IP address of the client sending the request to the server. This is not necessarily that of the user agent (such as if the request came through a proxy). 

その要求をサーバーに送信したクライアントの
IP アドレス。これは必ずしも[[利用者エージェント]]の
IP アドレスである必要はありません。
(たとえば[[串]]を通ってきた要求の場合。)

>
- REMOTE_ADDR  = hostnumber
- hostnumber   = ipv4-address | ipv6-address
> The definitions of ipv4-address and ipv6-address are provided in Appendix B of RFC 2373 [13]. 
> Servers MUST supply this value to scripts. 

[CODE[ipv4-address]] 及び
[CODE[ipv6-address]]
は [[RFC2373]] の付属書 B
で提供されています。

サーバーはこの値をスクリプトに供給し'''なければなりません ([[MUST]])'''。

[3] ごらんのように、 [NCSA] では [[IPv6]] アドレスの扱いが謎なんですが (そりゃぁその時代には存在してなかったんだから。)、 [COAR] ではそのままふつーに書けることが明確化しています。

;; [[IPv6アドレス]]は場面によっては [CODE[[['''['''[VAR[...]]''']''']]]] で括らなければなりませんが、
[CODE(CGI)@en[[[REMOTE_ADDR]]]] では括ってはいけないようです。

* 関連

[19] [[ドメイン名]]を値とする[[メタ変数]] [CODE(CGI)@en[[[REMOTE_HOST]]]] もあります。

[20] [CODE(CGI)@en[[[SERVER_NAME]]]] では[[IPv6アドレス]]は括弧で括られますが、
[CODE(CGI)@en[[[REMOTE_ADDR]]]] ではそうではありません。なぜ両者で違っているのかは不明です。