[22] [DFN[[CODE(URI)@en[[[ftp:]]]]]] は、 [[FTP]] によってアクセス可能な[[資源]]を表す [[URL]] です。 * 仕様書 [23] [CODE(URI)@en[[[ftp:]]]] [[URL scheme]] は現在公式には仕様書が存在しない状態です。 * 意味 [36] [[FTP]] の[[転送モード]]としては常に[[ストリーム・モード]]を使うことを表しています [SRC[>>7]]。 * 構文 @@ * userinfo [24] [CODE(ABNF)@en[[[userinfo]]]] に [[FTP]] でアクセスするための[[利用者名]]と[[合言葉]]を指定できます。 [SRC[>>7]] [25] 省略された場合の[[既定値]]は、[[匿名FTP]] の慣習により、[[利用者名]] [CODE@en[[[anonymous]]]]、[[合言葉]]が[[電子メール・アドレス]]となります。 この[[電子メール・アドレス]]は可能であれば実際に[[利用者]]が使えるアドレスとするべきであり、 [[クライアント]]の [[IPアドレス]]に解決されるような [[DNS]] [[ホスト名]]であることが好ましいとされています。ただし[[匿名FTP]] における[[鯖]]での[[合言葉]]の扱いは様々であるとされています。 [SRC[>>7]] * path [26] [[path]] は [CODE(char)[[[/]]]] で区切った [[segment]] の列で構成されますが、 それぞれについて [CODE[[[CWD]]]] [[命令]]を発行して[[作業ディレクトリー]]を変更し、 最後の [[segment]] について [CODE[[[RETR]]]] [[命令]]で[[ファイル]]を取得したり、 [CODE[[[NLIST]]]] [[命令]]で[[ディレクトリー]]内の一覧を取得したりすることを表しています。 [SRC[>>7]] [27] [[Unix]] では [CODE(char)[[[/]]]] を[[ディレクトリー]]の区切りに使うので、 [[FTP]] の [[URL]] と [[FTP]] の背後の[[ファイル・システム]]上の[[ディレクトリー]]が同じになることがあります。 ただし [[FTP]] を [[Unix]] [[ファイル・システム]]により実装しなければならないわけではありません。 [SRC[>>7]] [28] [[FTP]] 仕様上は [[FTP]] における[[階層化]]について共通のモデルが無く、 同じ[[ホスト]]の [[FTP]] アクセスを連続して行う時に意図した[[ディレクトリー]]へと確実に移動する方法がありません。 2つの同じ[[ホスト]]の [[FTP]] [[URL]] へのアクセスを意図通り確実に行う方法は、 一旦接続を切断して再接続するというものだけです。 [SRC[>>7]] ** ftptype [29] [[path]] の最後には[[データ型]]や[[ディレクトリー]]であることの指定を付加できます。 [SRC[>>7]] - [30] [CODE(URI)[[[/]]]]: [[ディレクトリー]] - [31] [CODE(URI)@en[[[type]]=[VAR[...]]]]: [CODE@en[[[TYPE]]]] [[命令]]の引数 -- [CODE[[[A]]]], [CODE[[[E]]]], [CODE[[[I]]]], [CODE[[[L]]]] のいずれか -- [CODE[[[A]]]], [CODE[[[E]]]] の場合は、その後に更に [CODE[[[N]]]], [CODE[[[T]]]], [CODE[[[C]]]] のいずれか -- [CODE[[[L]]]] の場合は、その後に1文字以上の [CODE(ABNF)@en[[[DIGIT]]]] [32] ファイルのデータ型は普通は判断することができず、通常は[[接尾辞]] ([[拡張子]]) から推定するしかありませんが、これも標準化されたものではありません。 [CODE[[[TYPE]]]] [[命令]]の引数によって指定するべき、転送に使うデータ型を [[path]] の後に指定することができます。また [CODE[[[/]]]] を指定することで、 [[ファイル]]ではなく[[ディレクトリー]]内の一覧を取得するように指定することができます。 [SRC[>>7]] [34] [[RFC 1630]] の構文定義上は[[大文字]]でなければならないように読めますが、 実際には[[小文字]]でも構わないようです。 [1] [CODE(URI)[frp://foo.example/bar]] という [[URI]] に基づいて [[FTP]] で [SAMP[foo.example]] に接続した時、 [[RFC1738]] に従えば [SAMP(FTP)[CWD bar]] を送る必要がありますが、多くの [[UA]] は [SAMP(FTP)[CWD /bar]] とします。 このため、 [CODE(URI)[frp://foo.example/~bar]] で、利用者 [SAMP[bar]] の [[HOME]] を示しているものを正しく動作させるためには最初の文字が [CODE(URI)[~]] である時だけ特別扱いしないといけません。 なお、 [[Lynx]] は RFC 1738 に触れながらも、現実の実装にあわせて敢えて 「間違った」やり方にしていると言っています。 RFC 1738 の方法に従うと、 FTP で接続した直後の current directory によって URI の指すものが変わってくる虞があります。 (参考 [[w3m-dev]] #3787) [2] >>1 のような事情で、 [SAMP(URI)[ftp://user@foo.example/]] だと root directory になるが、 [SAMP(URI)[ftp://user@foo.example/./]] だと [CODE(file)[~]] になるという裏技(?)があるらしい。 [4] RFC 1738 は RFC 1808 によって、以下の通り訂正されている。 NOTE: Section 5 of RFC 1738 specifies that the question-mark character ("?") is allowed in an ftp or file path segment. However, this is not true in practice and is believed to be an error in the RFC. Similarly, RFC 1738 allows the reserved character semicolon (";") within an http path segment, but does not define its semantics; the correct semantics are as defined by this document for . * 処理モデル ** フォーム提出 *** 仕様書 - [5] [CITE@en-US-x-hixie[Web Applications 1.0]] ([TIME[2011-06-04 00:47:42 +09:00]] 版) * 歴史 ** RFC 1630 [8] [[IETF]] として最初の [[URI]] の仕様書である [[RFC 1630]] には、 [CODE(URI)@en[[[ftp:]]]] [[URL]] の仕様も含まれていました。 [7] [CITE@en[RFC 1630 - Universal Resource Identifiers in WWW: A Unifying Syntax for the Expression of Names and Addresses of Objects on the Network as used in the World-Wide Web]] ([TIME[2011-06-04 17:20:47 +09:00]] 版) ;; 1994年 [35] 構文は次のように定義されていました [SRC[>>7]]。 [PRE(code)[ ftpaddress f t p : / / login / path [ ftptype ] login [ user [ : password ] @ ] hostport ftptype A formcode | E formcode | I | L digits formcode N | T | C ]PRE] ;; [33] [CODE(ABNF)@en[[[ftptype]]]] の定義が間違っています。なお、 [CODE(URI)[[[/]]]] で終わる[[ディレクトリー]]指定の場合は [CODE(ABNF)@en[[[path]]]] の定義に含まれています。 ** RFC 1738 [10] [[IETF]] [[標準化過程]]としては最初の [[URL]] の仕様書である [[RFC 1738]] にも、 [CODE(URI)@[[[ftp:]]]] [[URL]] の仕様が含まれていました。 [9] [CITE@en[RFC 1738 - Uniform Resource Locators (URL)]] ;; 1994年 ** RFC 1808 [11] [[IETF]] [[標準化過程]]としては最初の[[相対URL]] の仕様書である [[RFC 1808]] には、 [CODE(URI)@en[[[ftp:]]]] [[URL]] に関する[[相対URL]] の扱いについての規定も含まれていました。 [12] [CITE@en[RFC 1808 - Relative Uniform Resource Locators]] ;; 1995年 ** RFC 改訂、されない [16] [[RFC 1738]], [[RFC 1808]] はその後 [[RFC 2368]] (1998年), [[RFC 3986]] (2005年) と二度も改訂され、 [CODE(URI)@en[[[ftp:]]]] を含む個別の [[URL scheme]] の定義は含まれないようになりましたが、 [CODE(URI)@en[[[ftp:]]]] の定義は独立した [[RFC]] にならないまま [[RFC 1738]], [[RFC 1808]] ともに廃止されてしまいました。 [17] 現実には [CODE(URI)@en[[[ftp:]]]] は [[URL scheme]] の中ではよく使われている部類なのですが、 数年以上公式には廃止された状態が続くとか、 [[IETF]] の[[標準化過程]]は無茶苦茶ですね。 [18] 一応 [[I-D]] はありますが、果たして完成するのかどうか。 [19] [CITE@en[draft-hoffman-ftp-uri-04 - The ftp URI Scheme]] ;; 2004年/2005年 [15] [CITE@en[draft-yevstifeyev-ftp-uri-scheme-01 - The \x27ftp\x27 URI Scheme]] ;; 2011年 ** フォーム提出 [6] [[Web Forms 2.0]] ではじめて [CODE(URI)@en[[[ftp:]]]] [[URL]] への[[フォーム提出]]の処理モデルが規定されました。 これはその後 [[Web Applications 1.0]] に取り込まれました。 [3] [CITE@en-GB-x-Hixie[Web Forms 2.0]] ([TIME[2009-01-05 20:07:15 +09:00]] 版) * 例 [13] [PRE(URI example code)[ ftp://ftp.is.co.za/rfc/rfc1808.txt ]PRE] [14] [PRE(URI example code)[ ftp://user@example.com:/pub/ruby;type=i ]PRE] ;; この [[URL]] を書いた人の意図とは違うような気もしますが、たまたま正しい [[URL]] です。 * 関連 [20] [CODE(URI)@en[[[ftp:]]]] と [CODE(URI)@en[[[file:]]]] はしばしば混同されますが、別物です。 [21] [CODE(URI)@en[[[sftp:]]]]、[CODE(URI)@en[[[tftp:]]]] という [[URL scheme]] がありますが、そもそも [[FTP]] と [[SFTP]] や [[TFTP]] は別物です。