[125] [DFN[[CODE(URI)@en[[[file:]]]]]] は、[[ファイル]]を表す [[URL scheme]] です。 * 仕様書 [126] かつては [[RFC 1738]] で定義されていましたが、厳密には様々な[[利用者エージェント]]により様々に実装されており、 実情を反映していませんでした。現在では公式に [[RFC 1738]] も廃止され、名実共に標準不在となっています。 * 構文 [127] [[URL scheme]] である「[CODE(URI)@en[[[file:]]]]」の後に[[ファイル名]]を指定しますが、 この[[ファイル名]]は他の [[URL]] と似たものから各 [[OS]] の[[ファイル名]]の表記法に従ったもの、 あるいはその混合や折衷など様々な形が知られています。 [128] [[ファイル名]]の部分はその環境における[[ファイル・システム]]上の位置をそのまま表記することもあれば、 [[相対参照]]のようなものを使うことや、[[利用者エージェント]]が仮想的に[[ファイル]]のように見せて提供するものを示す文字列であることもあります。 * 素片識別子 [129] 通常の [[URL]] の規則に従い[[素片識別子]]が利用可能であることが一般的ですが、 [CODE(URI)[[['''#''']]]] も[[ファイル名]]の一部と解されることもあります。 * 歴史 ** RFC 1630 [REFS[ - [90] [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]] ]REFS] [91] [[IETF]] の [[RFC]] として最初に [CODE(URI)@en[[[file:]]]] [[URL]] を定義したのは [[RFC 1630]] でした。 [95] [CODE(URI)@en[[[file:]]]] は他の [[URL scheme]] とは違ってどこでも同義ではなく、 解釈する[[ホスト]]によって異なるという点が特殊です。しかし[[ローカル・ファイル・システム]]の[[ファイル]]を指す [[URL]] は必要性があるために定義したとされています。 [92] 構文は [CODE(URI)@en[[[ftp:]]]] と同じながら、 [CODE(URI)[[[/]]]] は[[ディレクトリー]]の[[分離子]]を表すものとされていました。 なぜか [[BNF]] 構文は示されていませんでした。 [93] [[authority]] については、 [CODE(URI)@en[[[file:]]]] [[URL]] は解釈により[[ホスト]]によって指すものが変わり混乱の元であり、 有害な場合もあるため、異なる[[ホスト]]のものを指すことを明確にするために利用可能となっている、 と説明されていました。また、他の[[ホスト]]の[[ファイル]]にアクセスする手段があればそれを使ってもよいとされていました。 [94] 特別な [[authority]] である [CODE(URI)[[[localhost]]]] は、 [[authority]] が空であるのと同義であり、どの[[ホスト]]であってもその[[ホスト]]を表すとされていました。 [123] これはどの[[ホスト]]でも共通で[[マウント]]されているような[[ファイル]]や、 [CODE(file)[[[/etc/hosts]]]] のようにおおくの[[ホスト]]で共通に存在する[[ファイル]]に有用とされていました。 ** RFC 1738 [REFS[ - [101] [CITE@en[RFC 1738 - Uniform Resource Locators (URL)]] -- [96] '''''' -- [102] ]REFS] [98] 次に [CODE(URI)@en[[[file:]]]] [[URL]] を定義したのは [[IETF]] [[標準化過程]] [[RFC]] であった [[RFC 1738]] でした。 [[IANA]] にも登録されました。 [99] [[authority]] は [[FQDN]]、[[path]] はその [[FQDN]] で表される[[ホスト]]における[[パス]]を表すとされていました [SRC[>>96]]。 [100] 構文は次のように定義されていました [SRC[>>102]]。 [PRE(ABNF code)[ fileurl = "file://" [ host | "localhost" ] "/" fpath ]PRE] [103] [CODE(URI)@en[[[localhost]]]] や[[空文字列]]はやはりその[[ホスト]]を表すとされていました [SRC[>>96]]。 ** draft-hoffman-file-uri (2004) [REFS[ - [106] [CITE@en[draft-hoffman-file-uri-03 - The file URI Scheme]] ]REFS] [107] [[RFC 1738]] の次の [[RFC 2396]] は [[URL scheme]] の定義を含んでおらず、 [CODE(URI)@en[[[file:]]]] [[URL]] についても個別の [[Internet Draft]] が出版されましたが、 [[RFC]] 化には至らず現在まで放置されています。 [108] 現在では [[IETF]] 的には公式には [[RFC 1738]] は[[廃止]]されており、 [CODE(URI)@en[[[file:]]]] [[URL]] は標準不在となっています。 [109] この [[Internet Draft]] は基本的には [[RFC 1738]] の定義を引き継いでいますが、 次のような記述が追加されています。 - [110] システム間やシステム内で [CODE(URI)@en[[[file:]]]] [[URL]] の互換性が無いことが多く、 この問題を解決しないでよくあるものを説明するに留める - [111] [[ディレクトリー]]を表すときは [CODE(URI)[[[/]]]] で終えることが多いが、必ずではない - [112] [[ドライブ]]は [CODE(URI)[c:]] だったり [CODE(URI)[c|]] だったり [CODE(URI)[c]] だったりする - [113] [[authority]] は [[FQDN]] とされているが、実際には従っていないことが多く、 [[authority]] 自体ないこともある - [114] [[ファイル名]]の[[文字符号化]]は様々なので、実装は [[Unicode]] と相互変換するのが望ましい ** RFC 3986 [132] あくまで例示としてではありますが、 [[RFC 3986]] は、 [CODE(URI)@en[[[file:]]]] [[URL]] では [[authority]] の省略、空の [[host]]、 [CODE(URI)[[[localhost]]]] はいずれも当該[[利用者]]の[[計算機]]を指すものと定義されている、 と述べています。 [REFS[ - [133] [CITE@en[RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax]] ([TIME[2011-08-16 18:56:43 +09:00]] 版) ]REFS] * 関連 [104] 遠隔の[[ファイル]]にアクセスする[[プロトコル]]や[[ファイル・システム]]は大抵専用の [[URL scheme]] が存在しています。例: [CODE(URI)@en[[[ftp:]]]], [CODE(URI)@en[[[nfs:]]]], [CODE(URI)@en[[[afs:]]]], [CODE(URI)@en[[[smb:]]]] [105] [[Webブラウザー]]などのシステムに組み込まれた特別な[[ファイル]]については専用の [[URL scheme]] が存在することがあります。例: [CODE(URI)@en[[[about:]]]], [CODE(URI)@en[[[res:]]]], [CODE(URI)@en[[[resource:]]]], [CODE(URI)@en[[[chrome:]]]], [CODE(URI)@en[[[chrome-extension:]]]], [CODE(URI)@en[[[shell:]]]], [CODE(URI)@en[[[moz-icon:]]]], [CODE(URI)@en[[[rom:]]]], [CODE(URI)@en[[[device:]]]] * メモ [57] [[DOS]] ・ [[Windows]] 系の [CODE(URI)[file:]] URI の形式の色々: - 通常のファイル -- [CODE(ABNF)[[[authority]]]] の部分 --- 空の [CODE(ABNF)[authority]] ([SAMP(URI)[file:///c:/]] など) --- [CODE(URI)[[[localhost]]]] ([SAMP(URI)[file://localhost/c:/]] など) --- ドライブ名 ([SAMP(URI)[file://c:/]] など) --- なしで、斜線1つから ([SAMP(URI)[file:/c:/]] など) --- なしで、直接ドライブ名に ([SAMP(URI)[file:c:/]] など) -- ドライブ名の部分 --- 大文字か、小文字か ---- 大文字 ---- 小文字 --- 記号 ---- コロン ([SAMP(URI)[file:///c:/]] など) ---- [[百分率符号化]]されたコロン ([SAMP(URI)[file:///c%3A/]] など) ---- 縦棒 ([SAMP(URI)[file:///c|/]] など) ---- [[百分率符号化]]されたコロン ([SAMP(URI)[file:///c%7C/]] など) ---- 省略 ([SAMP(URI)[file:///]] など) -- 経路 (ファイル名・ディレクトリ名) --- 区切り文字 ---- 斜線 ([SAMP(URI)[file:///c:/windows/explorer.exe]] など) ---- 逆斜線 ([SAMP(URI)[file:///c:\windows\explorer.exe]] など) ---- 百分率符号化された逆斜線 ([SAMP(URI)[file:///c:%5Cwindows%5Cexplorer.exe]] など) ---- 混在している場合 ---- 複数個連続する場合 ([SAMP(URI)[file:///c://windows///explorer.exe]] など) --- 大文字と小文字 ---- ファイル・システムにおける大文字・小文字の使い分けと同じもの ([SAMP(URI)[file:///C:/WINDOWS/EXPLORER.EXE]] など) ---- ファイル・システムにおける大文字・小文字の使い分けと違うもの ([SAMP(URI)[file:///c:/wIndoWs/eXplorer.eXe]] など) --- 百分率符号化 ---- 百分率符号化されたもの ----- 使用しているシステムの内部文字コード ([[Windows-31J]] や [[UTF-16]] など) によるもの ----- 使用しているシステムの外部文字コード ([[Windows-31J]] など) によるもの ----- [[UTF-8]] によるもの ---- 百分率符号化されていないもの ----- URI の予約文字が含まれないもの ----- URI の予約文字が含まれるもの ([SAMP(URI)[file:///C:/Example #1/Test #2.txt]] など) ----- URI で使えない文字が含まれるもの ([SAMP(URI)[file:///C:/Program Files/]] など) --- [[長いファイル名]] ---- 普段使用されるファイル名 ([[長いファイル名]]) ---- [[VFAT]] などにおける互換性のための[[短いファイル名]] ---- 経路中に混在する場合 --- ディレクトリを表す場合、末尾に経路区切り記号をつけるか否か - 特殊なファイル・経路 -- [CODE(file)[\\.\]] から始まる経路に対応するもの ([[Win32]] で[[装置]]ファイルに対応) -- [CODE(file)[\\?\]] から始まる経路に対応するもの ([[Win32]] で局所ファイルに対応) -- 末尾が [CODE(file)[.]] や[[間隔]] (任意個) である経路に対応するもの ([[Win32]] [[API]] で普通無視される) -- ドライブ指定以外で [CODE[:]] を含む経路に対応するもの ([[NTFS]] の [[stream]] の指定に対応) -- [[装置]]ファイル名が含まれるもの -- 仮想ファイル (>>41 など) - ネットワーク上のファイル -- [CODE(ABNF)[authority]] を使用 ([SAMP(URI)[file://host/path/to/file]] など) - 相対参照 (真の相対参照, 絶対 URI 参照の仲の [CODE(ABNF)[[[path]]]] が実は相対参照) -- [CODE(URI)[.]] (同じ階層) -- [CODE(URI)[..]] (一つ上の階層) -- [CODE(URI)[...]] (二つ上の階層) など、更に多い場合 -- [SAMP(URI)[foo/not-found/../baz]] ([SAMP(file)[not-found]] は実は不存在) のような場合 -- ドライブを超えた相対参照 (>>48 など) -- [CODE(ABNF)[[[scheme]]]] や斜線はあるが、実は相対参照 (>>52 など) -- 相対参照に[[ドライブ文字]]を付けたもの ([CODE(example)[C:System32\Drivers]] など) - [[Cygwin]] のような [[Un|x]] 風システムを使用している場合 -- [SAMP(file)[/cygdrive/c/windows/]] のような経路に対応するもの [58] '''[[Un|x]] 系の [CODE(URI)[file:]] URI の色々''': - 絶対経路によるファイル -- [SAMP(URI)[file:///path/to/file]] -- [SAMP(URI)[file://localhost/path/to/file]] -- [SAMP(URI)[file://path/to/file]] -- [SAMP(URI)[file:/path/to/file]] -- [SAMP(URI)[file:path/to/file]] (絶対経路? 相対経路?) - [[symbolic link]] を辿るか否か - [[home directory]] を表す表現 -- [SAMP(URI)[file:~user/path/to/file]] -- [SAMP(URI)[file:///~user/path/to/file]] ほか各種 -- [CODE(URI)[~]] を [CODE(URI)[%7E]] としたもの各種 [59] '''照会''': 局所ファイルを[[実行]]させる機能がある[[利用者エージェント]]は [CODE(ABNF)[[[query]]]] の使用を認めていることがあります。 [[#comment]] ** file: 以下のさまざまな表現形式 [8] 特に [[Windoze]] 上の [[UA]] において、 file: 以下のあらわしかたには様々なものがありました。 ,[[UA]] ,file: ,== ,== ,file:// ,== ,== ,file:/// ,== ,== ,file://localhost/ ,== ,== ,メモ , ,C|/ ,C:/ ,"C:\\" ,C|/ ,C:/ ,"C:\\" ,C|/ ,C:/ ,"C:\\" ,C|/ ,C:/ ,"C:\\" , ,M$IE2.0 ,○ ,○ ,○ , , , ,○ ,○ ,○ , , , , ,11111 , , , , , , , , , , , , , [[#form:',%text(id=>ua);,%check;,%check;,%check;,%check;,%check;,%check;,%check;,%check;,%check;,%check;,%check;,%check;,%text(id=>condition,size=>5); %submit(label=>"追加");':',%text(source=>ua);,%iif(source=>_no1,true=>○);,%iif(source=>_no2,true=>○);,%iif(source=>_no3,true=>○);,%iif(source=>_no4,true=>○);,%iif(source=>_no5,true=>○);,%iif(source=>_no6,true=>○);,%iif(source=>_no7,true=>○);,%iif(source=>_no8,true=>○);,%iif(source=>_no9,true=>○);,%iif(source=>_no10,true=>○);,%iif(source=>_no11,true=>○);,%iif(source=>_no12,true=>○);,%text(source=>condition);':'%require(ua);']] *** file://C|/*/* [[#form:'%text(id=>ua,label=>"[[UA]]"); %check(label=>対応している,default,id=>support); %text(id=>condition,label=>詳細,size=>10); %submit(label=>"追加");':'-[%index;] \'\'%text(source=>ua);\'\': \'\'\'%iif(source=>support,true=>対応。,false=>未対応。);\'\'\'%text(source=>condition);':'%require(ua);']] *** file://C:\*\* - [54] ''file://C:'': '''対応。''' - [56] ''11'': '''対応。''' [[#form:'%text(id=>ua,label=>"[[UA]]"); %check(label=>対応している,default,id=>support); %text(id=>condition,label=>詳細,size=>10); %submit(label=>"追加");':'-[%index;] \'\'%text(source=>ua);\'\': \'\'\'%iif(source=>support,true=>対応。,false=>未対応。);\'\'\'%text(source=>condition);':'%require(ua);']] *** file:///* [[#form:'%text(id=>ua,label=>"[[UA]]"); %check(label=>対応している,default,id=>support); %text(id=>condition,label=>詳細,size=>10); %submit(label=>"追加");':'-[%index;] \'\'%text(source=>ua);\'\': \'\'\'%iif(source=>support,true=>対応。,false=>未対応。);\'\'\'%text(source=>condition);':'%require(ua);']] *** file:///C|/*/* - [4] ''Infomosaic/2.0.0 Final Beta J4 (Windows x86)'': 対応。 - [6] '' MosaicView/2.0009 Win32 NEC/9'': 対応。 [[#form:'%text(id=>ua,label=>"[[UA]]"); %check(label=>対応している,default,id=>support); %text(id=>condition,label=>詳細,size=>10); %submit(label=>"追加");':'-[%index;] \'\'%text(source=>ua);\'\': \'\'\'%iif(source=>support,true=>対応。,false=>未対応。);\'\'\'%text(source=>condition);':'%require(ua);']] *** file:///C:\*\* - [10] ''MSIE 2.0'': 対応。アドレスバーはすぐに >>9 に書き換えられる。 [[#form:'%text(id=>ua,label=>"[[UA]]"); %check(label=>対応している,default,id=>support); %text(id=>condition,label=>詳細,size=>10); %submit(label=>"追加");':'-[%index;] \'\'%text(source=>ua);\'\': \'\'\'%iif(source=>support,true=>対応。,false=>未対応。);\'\'\'%text(source=>condition);':'%require(ua);']] *** file://localhost/* - [1] しばしば使われる。 - [5] [[JustView]] [[#form:'%text(id=>ua,label=>"[[UA]]"); %check(label=>対応している,default,id=>support); %text(id=>condition,label=>詳細,size=>10); %submit(label=>"追加");':'-[%index;] \'\'%text(source=>ua);\'\': \'\'\'%iif(source=>support,true=>対応。,false=>未対応。);\'\'\'%text(source=>condition);':'%require(ua);']] *** file://network-host-name/* - [2] [[WinIE]] では、 [CODE[\\network-host-name\*]] の参照として使用出来る。 - [3] [[Mozilla]] on [[Win32]] では不可。 [[#form:'%text(id=>ua,label=>"[[UA]]"); %check(label=>対応している,default,id=>support); %text(id=>condition,label=>詳細,size=>10); %submit(label=>"追加");':'-[%index;] \'\'%text(source=>ua);\'\': \'\'\'%iif(source=>support,true=>対応。,false=>未対応。);\'\'\'%text(source=>condition);':'%require(ua);']] *** file:C:\*\* - [9] ''Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)'': 対応。この形式を実装したのは、おそらく M$IE が最初でしょう。 [[#form:'%text(id=>ua,label=>"[[UA]]"); %check(label=>対応している,default,id=>support); %text(id=>condition,label=>詳細,size=>10); %submit(label=>"追加");':'-[%index;] \'\'%text(source=>ua);\'\': \'\'\'%iif(source=>support,true=>対応。,false=>未対応。);\'\'\'%text(source=>condition);':'%require(ua);']] *** Windoze の特殊フォルダの表現 [41] [[Windoze]] ([[WinIE]]) では、特殊フォルダをあらわす次のような形式 ([SAMP(URI)[file:///::{[VAR[clsid]]}]]) が使えます。 この機能は遅くても [[Win2k]] で実装されています。 例: :[[My Document]]:[SAMP(URI)[file:///::%7B450d8fba-ad25-11d0-98a8-0800361b1103%7D]] :[[My Computer]]:[SAMP(URI)[file:///::%7B20D04FE0-3AEA-1069-A2D8-08002B30309D%7D]] :[[Network Neighborhoods]]:[SAMP(URI)[file:///::%7B208D2C60-3AEA-1069-A2D7-08002B30309D%7D]] フォルダによっては [[CLSID]] 表現ではなく、 [[shell:]] scheme が使用されます。 - [52] [[desktop.ini]] では [CODE(URI)[file://Folder Settings\folder.htt]] とか [CODE(URI)[file://folder.htt]] とか書けるらしいです。。。 [[#comment]] ** 実装 *** Mosaic Netscape 0.9 Beta (Win16 版 on Win95) [13] 実験してみますた。 [CODE[file:///]] でドライブ一覧 ([CODE[A|/]] とかが並んでる。) が出てきます。 Location: 欄に [CODE[file:///C|/]], [CODE[file:///C:/]], [CODE[file:///C%7C/]] と入力すると望んだものが出てきますが、 [CODE[file:///C:\]] とすると busy で死んでしまいました。 [CODE[file://]] はだめでした。 - [45] >>13 NN 2.01 でもやっぱり固まります。 [[#comment]] *** memo [14] [[Lynx]] では [[HOME]] を表す [[~]] が使えます。 [CITE[URL Schemes Supported in Lynx]] - [44] NN2 ですが、 [CODE(URI)[file:///c:/]] と [CODE(URI)[file:///C|/]] は、得られる効果は同じですが、違うものとして扱われているようです。 (redirect みたいな関係にはないようです。) [SAMP[テ゛ィレクトリ /C%3A]] とか [SAMP[/%7C]] とか「ちゃんと」表示されます。 - [48] 相対 URI [SAMP(URI)[../D|/foo/]] (基底 [SAMP(URI)[file:///C|/]]) のような表現が使える実装もあるそうです。いやいや、これは URI 一般構文から見ればぜんぜん不思議でなく、むしろこうかけなければなりませんが。 [53] Un|x 版 Mozilla 1.2.1 ですが、[CODE(ABNF)[authority]] は常に無視して [CODE(URI)[localhost]] であるかのように扱ってくれます。何か変ですし、 [CODE(URI)[/]] が3本のつもりで2本にしてしまっても間違いに気づかずに変な結果が出て萎えます。 他の版でも同様な結果だったような気がしますがたしかめていません。とりあえず手元の版ではこうなりました。 ([[名無しさん]] [WEAK[2004-05-10 05:13:16 +00:00]]) [42] ほとんど (すべて?) の実装では、[[ディレクトリ]]・ [[フォルダ]]の最後に [CODE(URI)[[[/]]]] があってもなくても同義と解釈します。 [43] [[ハードリンク]], [[シンボリックリンク]]は多分そのシステムでの普通の扱い同様追いかけてくれます (ハードリンクは本物と区別できないかもしれませんがね)。 [[ショートカット]], [[エイリアス]], [[シャドウ]]などについても同様の実装があるかもしれません。 [WEAK[(ないかもしれません。)]] [46] [[Perl]] の実装である [CODE(perl)[[[URI::file]]]] は、 [CODE(ABNF)[[[authority]]]] で[[装置]]名その他 [WEAK[([[DOS]] の[[ドライブ]]名とか。)]] を書くのは良い考えじゃないか? と述べています。このモジュールは意図的に [SAMP(URI)[file:/usr/bin/perl]] みたいな書き方を使ってるみたいです。 - [49] [[w3m]] では、使える場面は限られますが、変数 [VAR(URI)[$LIB]] が使えます。例: [SAMP(URI)[file:///$lib/foo/bar]] - [50] また、 w3m にはやはり限られますが、 [CODE(URI)[cgi-bin]] という仮想ディレクトリを設定で作れます。 [SAMP(URI)[file:///cgi-bin/foo.cgi]] を [SAMP(file)[/path/to/foo.cgi]] に対応させられます。 [51] そして注目すべきは、 w3m の [[local CGI]] 機能の都合上、 [CODE(URI)[file:]] URI でも[[照会]]が使われるのです。 [55] 絶対 URI だけではなくて、相対 URI もいろいろ。 [[RFC 1808]]/[[RFC 2396]] 的にはあってはならないことですが。 たとえば Windows では [CODE(URI)[/]] drive の根になるのか、その一つ上の階層(謎)になるのか、とか、 [CODE(URI)[\]] も path の区切りになるのか、とか。 [CODE(URI)[c:/]] みたいなのを [CODE(URI)[file:///c:/]] の意味にとるのもありそう。 [67] [CITE[freedesktop.org - Standards/file-uri-spec]] [[UNIX]]環境における[CODE(URI)@en[[[file]]:]] [[URI]]と[[ファイル名]]の写像の仕様を作ろうとしているようですが、今のところ何もありません。 ([[名無しさん]] [sage] [WEAK[2006-01-03 05:37:05 +00:00]]) [68] [CITE[Commons VFS - Supported File Systems]] [[UNIX]]と[[Windows]]の[[ファイル名]] ([[UNC]]を含みます。) は、[CODE(URI)@en[[[file]]://]]を最初につけるだけで[[URI]]にしています。 ([[百分率符号化]]はします。) [[Windows]]の場合、 [CODE(char)[\]]と[CODE(URI)@en[/]]はどちらでもよいようです。 ([[名無しさん]]) [69] [CITE[Checking document()]] [[XSLT]]の[CODE(XPathf)@en[[[document]]()]][[関数]]の実装状況 ([[名無しさん]]) [71] [CITE[The xdg April 2004 Archive by thread]] >>67 についての議論です。 - 基本的には[[RFC 1738]]の構文を採用します。 - 既存の実装との互換性のため、 [CODE(URI)@en[[[file]]:/[VAR@en[path]]]] 形式も理解できるようにします。 - [CODE(ABNF)@en[[[authority]]]]を明示する時は ([CODE(URI)@en[[[localhost]]]]か) [CODE(C)@en[[[gethostbyname]]]]で得られた値を使います。 - [[UNIX]]の[[ファイル名]]は[[バイト列]]なので、[[UTF-8]]などではなく、実際の[[ファイル名]]の[[バイト列]]を使います。 という感じのようです。 ([[名無しさん]]) [72] [[KDE]]は動的に生成された内容に対して[CODE(URI example)@en[file:/cgi-bin/helpindex]]のような[[URI]]を使っています。 ([[名無しさん]] [sage]) [73] [CITE[URL Schemes Supported in Lynx]] ([[名無しさん]] [sage]) [76] [CITE[IEBlog : File URIs in Windows]] ([[名無しさん]] [WEAK[2006-12-06 23:31:28 +00:00]]) [[#comment]] ** 相互運用性 [58] ここまで見てきたように、 [CODE(URI)[file:]] URI scheme は標準不在の状況です。どうせ局所的にしか使わないのだからどうでもいいだろうという言い訳のもとに最早収拾がつかない状況に陥っています。 相互運用性なるものは期待するだけ無駄でしょう。 [[#comment]] ** 安全性 [16] [CITE[8-1. Windowsパス名の落とし穴]] [[Windows]] の[[ファイル名]]の色々な表現について。この記事は直接 [CODE(URI)[file:]] の問題を扱ったものではありませんが、 余り気にせずに実装すると [CODE(URI)[file:]] URI でも同じ問題を抱えることになります。 [17] >>16 の問題が広く取り上げられた例として、 [CODE[[[CON]]]] [CODE[CON]] 問題がありました。 - [18] ''スラッシュドット ジャパン | c:\auxでIEがクラッシュする脆弱性'' - [19] [[Un|x]] でも、 [[Mozilla]] で [CODE(URI)[file:///dev/zero]] を見ようとすると困ったことになるとか、同様の問題があったりもします。 - [20] 流石に [[WinIE6.0]] でも Mozilla 1.4 でも、 [SAMP(URI)[file:///?/c:/windows/]] とか [SAMP(file)[\\?\c:\windows]] とかは機能しないみたい。 [60] '''外部文書からの参照''': 信頼できるか不明な相手から送られてきた文書中に [CODE(URI)[file:]] URI が記述されていた場合、それをどう処理するかは注意が必要です。 例えば、埋込み[[画像]]として[[利用者]]の手元のファイルが指定されていると、 利用者は外部から送られてきた文書に自分の手元の画像が含まれていると思って混乱するかもしれません。 [[Webブラウザ]]で[[ディレクトリ]]を指定すると手元のファイルの一覧表示が行われるように実装されていることを期待して、 利用者の環境が外部から丸見えであるかのように錯覚させて安全対策と称した怪しいソフトウェアを売り込む怪しい Web サイトも実在します。 心理的な[Q[攻撃]]だけではなく、実際に攻撃することも可能です。 例えば埋込み画像として [[PC/AT互換機]]+ [[DOS]]・[[Windows]] では[[フロッピー・ディスク]]のドライブを表す [SAMP(URI)[file:///a:/fake.jpg]] のような指定を行うと、 [WEAK[(ファイルが実在するかに関わらず)]] フロッピー・ディスクに探しに行くと思われるので、 突然カタカタと音が鳴り出して利用者は不安・不快に思うかもしれません。 数が多ければ[[ブラクラ]]や [[DoS]] ともなり兼ねません。 [61] '''URI を指定できる公開サービス''': [[URI]] を指定して、その URI によって[[取出し]]できる[[資源]]に対して操作するような公開のサービスでは、 意図せずに [CODE(URI)[file:]] URI によって[[鯖]]内部のファイルを閲覧・ 利用されてしまうことがないように注意が必要です。 特に URI から取出しを行うために[[ライブラリ]]を使っている場合、 [CODE(URI)[http:]] URI だけを使うことを想定していても [CODE(URI)[file:]] URI の場合の処理も実装されていることがよくあります。 [63] '''外部への情報提供''': [[転送プロトコル]]や[[スクリプト]]などを介して[[履歴]]情報などを提供する場合、 個人情報保護 (と場合によってはシステムの安全) の観点から[Q[外部]]と考えられるところには情報を送らない (取出せない) ように配慮が必要です。 例えば、 [[HTTP]] にはリンク元の [[URI]] を記述する [CODE(HTTP)[[[Referer]]:]] という[[頭欄]]がありますが、 [CODE(URI)[file:]] URI の文書から [CODE(URI)[[[http]]:]] URI の文書へのリンクを辿ったような場合には [CODE(URI)[file:]] URI を [CODE(HTTP)[Referer]] として送るべきではありません。 古い[[利用者エージェント]]はこの配慮を怠っていたものがありましたが、 最近の [[Webブラウザ]]は注意しているようです。 文書内のリンク以外では[[栞]]や[[履歴]]や同時に表示している別の文書へのスクリプトからのアクセスなどで注意が必要です。 [64] '''[CODE(URI)[file:]] は安全とは限らない''': 普通 [CODE(URI)[file:]] URI は局所ファイルを表しますから比較的安全だと考えがちですが、 必ずしもそうとは言えません。 [CODE(ABNF)[[[authority]]]] は実は何でも書けますから近くのネットワーク上のホストかもしれませんし、 知らない遠くの[[ファイル鯖]]かもしれません。 たとえ [CODE(URI)[localhost]] でも、局所ファイル・システム木に mount されたネットワーク上のファイル庫である可能性はざらにあります。 [[#comment]] ** 例 - [11] [CODE[file:/path/to/something]] - [12] ''Another HTML-lint : Explanation'' ちょっとだけ参考になる例があります。 - [15] [SAMP(URI)[file://\\host\sharename\dir\file]] (WinIE) - [47] [SAMP(URI)[file://./backofficestorage//MBX//Calendar]] [SRC[[[Microsoft]]]] [87] [PRE(URI example code)[ file:///Macintosh HD/書類/test.html ]PRE] 旧 [[Mac OS]]のファイル。 [88] [PRE(URI example code)[ file:/Macintosh HD/Applications/ ]PRE] [97] [PRE(URI example code)[ file://vms.host.edu/disk$user/my/notes/note12345.txt ]PRE] [[VMS]] における [CODE(file)[DISK$USER:[MY.NOTES]NOTE123456.TXT]] を表します [SRC[>>96]]。 [115] [CODE(URI)@en[[[localhost]]]] と[[空文字列]]は等価です [SRC[>>106]]。 [PRE(URI example code)[ file://localhost/path/to/file.txt file:///path/to/file.txt ]PRE] [116] [PRE(URI example code)[ file://usr/local/bin/ ]PRE] [[ディレクトリー]]を表すため [CODE(URI)[[[/]]]] で終わっています [SRC[>>106]]。 [117] [SRC[>>106]] [PRE(URI example code)[ file:///c:/windows/example.ini ]PRE] [118] [PRE(URI example code)[ file:////department/example.doc ]PRE] [[共有ディレクトリー]] [CODE(file)[department]] の [CODE(file)[example.doc]] を表します [SRC[>>106]]。 ;; [119] [[ホスト名]]じゃなくて[[共有ディレクトリー]]なのですか。しかも [CODE(URI)[[[//]]]] や [CODE(URI)[[[/////]]]] じゃなくて [CODE(URI)[[[////]]]] なのですか。。。 [120] [[Windows]] の[[ドライブ]]の表現方法は色々あります [SRC[>>106]]。 [PRE(URI example code)[ file:///c|/tmp/test.txt file:///c:/tmp/test.txt file:///c/tmp/test.txt ]PRE] [121] [SRC[>>106]] [PRE(URI example code)[ file:/this/is/the/path ]PRE] [62] [[Web]] で公開されている [[著述工具]]によって作成されたとおぼしき [[HTML文書]]で、 [[画像]]の参照先や[[リンク]]先が [CODE(URI)[file:]] URI で[[閲覧者]]には何も見れないことがしばしばあります [WEAK[(製作者の手元では正しく表示されるので気づかないのでしょう)]]。 著述工具は普通作成した文書を何らかの形で公開することを想定しているはずですから、 URI が [CODE(URI)[file:]] であるなら保存時に警告するなど配慮するべきです。 また、著述工具や Web ブラウザは著者のために [CODE(URI)[file:]] URI が機能しないモードを [WEAK[(マークの誤り回復を行わないなどの機能と共に)]] 用意すると便利かもしれません。 [65] [[Firefox]] は各システム環境の標準の[[文字コード]]で[[百分率符号化]]するみたいです。 ([[名無しさん]] [sage] [WEAK[2005-12-25 13:39:58 +00:00]]) [66] [[Firefox]] on [[Win32]] で[[LAN]]上の別計算機の[[ファイル]]を開くと、[CODE(URI example)@en[file://///host/path/to/file]]のような、[CODE(URI)@en[[[file]]:///]]の後に[[UNC]]の[CODE(file)[\]]を[CODE(file)@en[/]]にしたようなものが[[URI]]となるようです。 ([[名無しさん]] [sage]) [70] [CITE@en[draft-hoffman-file-uri]] ([[名無しさん]] [sage]) [74] [CITE[The 'file' URI Scheme Update Project.]] ([[名無しさん]]) [77] [CITE@ja-jp[Windows Mobile ヒント集 - インターネットの参照]] ([CODE[2007-03-15 19:30:09 +09:00]] 版) ([[名無しさん]]) [78] >>77 [CODE(URI example)@en[file://\windows\default-home.htm]] ([[名無しさん]]) [[#comment]] * memo [79] [CITE@en-US[Elements of an EmotionML 1.0]] ([TIME[2008-11-19 23:37:02 +09:00]] 版) [PRE(XML example code)[ ]PRE] [80] [CITE@ja[ASR's Room NicoCache Proxy Auto Config]] ([TIME[2008-03-06 00:57:58 +09:00]] 版) >IEの場合、「file://C:/path/to/xxx.pac」だとOKなのですが「file:///C:/path/to/xxx.pac」のように「///」で指定すると無視されるようなので気をつけてください。(ホームページの設定は「///」なのに…) * フォーム提出 [81] [CITE@en-GB-x-Hixie[Web Forms 2.0]] ([TIME[2009-01-05 20:07:15 +09:00]] 版) [82] [CITE[localhost]] ([TIME[2008-01-09 21:43:56 +09:00]] 版) [83] [CITE[XProc: An XML Pipeline Language]] ([TIME[2010-05-11 22:38:07 +09:00]] 版) [84] [CITE[IRC logs: freenode / #whatwg / 20101114]] ( ([TIME[2010-11-20 10:52:27 +09:00]] 版)) [85] [CITE[Standard for exchanging file: URIs]] ([TIME[2007-05-25 22:58:50 +09:00]] 版) [86] [CITE[freedesktop.org - Specifications/file-uri-spec]] ( ([TIME[2011-02-20 20:33:47 +09:00]] 版)) [89] [CITE[IEのローカルファイルをXHRでどこまで読みとらせるか - 葉っぱ日記]] ([TIME[2011-04-26 15:50:00 +09:00]] 版) [122] [CITE@en[File URI scheme - Wikipedia, the free encyclopedia]] ( ([TIME[2011-06-12 01:31:33 +09:00]] 版)) [124] [CITE[Bug 66194 – file:// Correct URLs w/ UNC have *5* slashes]] ( ([TIME[2011-06-27 00:26:14 +09:00]] 版)) [130] [[authority]] に[[ドライブ]]の類を指定するのが良いとする人もいます。 ;; [CITE[URI::file - search.cpan.org]] ([TIME[2011-07-02 12:38:09 +09:00]] 版) [131] [[ファイル・システム]]によっては名前に [CODE(char)[[[/]]]] や [CODE(char)[[[.]]]] や [CODE(char)[[[..]]]] を認めていることがあり、[[パーセント符号化]]によりこれを表すことがあります。 [134] [135] [CITE[''''''[''''''whatwg'''''']'''''' URL: file: URLs]] ( ([TIME[2012-10-29 05:29:48 +09:00]] 版)) [136] [CITE[IRC logs: freenode / #whatwg / 20121026]] ( ([TIME[2012-11-21 23:23:13 +09:00]] 版)) [137] [CITE[WWW-Talk Jan-Mar 1993: HTML todo list]] ( ([TIME[2013-03-05 12:40:15 +09:00]] 版)) [138] [CITE[WebKit組み込んでるアプリにおいて純粋にWebKit由来のバグであれば勝手に直ったりするけどWebKitをどういう設定で使っているかに起因する仕様上の欠陥は勝手に直らない - 金利0無利息キャッシング – キャッシングできます - subtech]] ( ([TIME[2013-06-12 01:31:50 +09:00]] 版)) [139] [CITE[Safariのfile://におけるSame origin policyについてのアップデート - 金利0無利息キャッシング – キャッシングできます - subtech]] ( ([TIME[2013-06-12 01:33:41 +09:00]] 版)) [140] [CITE[classic mozilla/cmd/winfe/fegui.cpp]] ( ([TIME[1998-11-09 21:50:39 +09:00]] 版)) [141] [CITE[Issue 257354 - chromium - file URL parsing quirks - An open-source project to help move the web forward. - Google Project Hosting]] ( ([TIME[2013-11-22 08:58:07 +09:00]] 版)) [142] [CITE@en[reviving the file URI scheme]] ( ([[Matthew Kerwin]] 著, [TIME[2013-12-12 16:46:38 +09:00]] 版))