[18] いくつかの [[Webブラウザー]]などは、 [CODE(URI)@en[[[file:]]]] [[URL]] などで[[ローカルファイル]]を
[[CGIスクリプト]]として実行する機能として [[CGI/1.1]] を実装していました。このような機能は[DFN[[RUBYB[ローカルCGI]@en[local CGI]]]]
などと呼ばれています。

[1] [[w3m]] は local file ([CODE(URI)[[[file:]]]] URI であらわされる資源) を [[HTTP]] のように [[CGIスクリプト]]として扱う local CGI 機能があります。少々の w3m の動作の取得・制御も可能です。

[2] 安全上の理由から、 local CGI script と認識され得るのは [CODE(URI)[file:///cgi-bin/]] 以下とかに限られます。 (このディレクトリは仮想で、実体は w3m の設定で指定します。)

* メタ変数

[9] [[Apache]] などと同じように、[[メタ変数]]は[[環境変数]]として提供されます。

[[CGI/1.1]] で規定されているほとんどのメタ変数を用意してくれます。独自拡張の [CODE(CGI)[[[REQUEST_URI]]]] にも対応しています。
詳しくはソース (>>8) を見て下さい。

[CODE(CGI)[[[HTTP_*]]]] 変数群は、
[CODE(CGI)[[[HTTP_REFERER]]]] 以外は用意しないようです。

[10] 注意しておきたい点としては、 [CODE(CGI)[[[REMOTE_ADDR]]]]
と [CODE(CGI)[[[REMOTE_HOST]]]] には常に
[CODE(CGI)[[[127.0.0.1]]]] と [CODE(CGI)[[[localhost]]]]
が、 [CODE(CGI)[[[SERVER_NAME]]]] と [CODE(CGI)[[[SERVER_PORT]]]]
にも常に [CODE(CGI)[localhost]] と [CODE(CGI)[[[80]]]]
が入るようになっています。 [CODE(CGI)[[[SEFVER_PROTOCOL]]]]
も常に [CODE(CGI)[[[HTTP/1.0]]]] です。
最後の2つは local でない CGI を emulate するためでしょうが、
このおかげで local でない CGI と local CGI
を完全に区別する方法はありません。

[11] とはいっても、 local でない CGI と local CGI
を区別するのは簡単です。 [CODE(CGI)[[[SERVER_SOFTWARE]]]]
には普段の HTTP 要求で [CODE(HTTP)[[[User-Agent]]]]
欄に送る値が入っていますから、これが [CODE(CGI)[w3m]]
で始まれば w3m が local CGI 機能を使っていると分かります。
(w3m variant でこの文字列が [CODE(CGI)[w3m]]
で始まらなかったら困るかもしれませんが。) 

[14] 変数 [CODE(CGI)[[[LOCAL_COOKIE_FILE]]]] には、
local [[Cookie]] に使用できるファイルの名前が入ります。

古い版 (2003年1月くらいの版まで) では、
[CODE(CGI)[[[LOCAL_COOKIE]]]] が使われてました。
こちらの変数には[[セッション]]識別子に使える値が入るみたいです。

[12] この他に、 [CODE[W3M_[VAR[*]]]] 変数群から情報を取得することもできます。

[[#comment]]


* CGI 頭欄

[13] w3m 独自の [CODE(CGI)[[[w3m-control]]]] 欄が用意されています。
これを使うと任意の機能を実行できます。
[CODE(file)[README.func]] <http://cvs.sourceforge.net/viewcvs.py/w3m/w3m/doc-jp/README.func>
に機能の一覧があります。

この欄を複数個出力すれば、その順に実行できます。
なお、 local CGI スクリプトからではない通常の [[HTTP]]
[[応答]]でこの欄は認識されません。[WEAK[されるとしたら危険なことに。。。]]

[[#comment]]


* 参考文献

- [7] ''w3m manual'' <http://w3m.sourceforge.net/MANUAL#LocalCGI>
- [8] ''w3m/w3m/local.c'' <http://cvs.sourceforge.net/viewcvs.py/w3m/w3m/local.c> : 
実装のソース。
- [15] <http://cvs.sourceforge.net/viewcvs.py/w3m/w3m/scripts/> : 実際の local CGI を使ったスクリプトがありますから、参考になるでしょう。
- [6] w3m-990406 以降で実装されている。
- [3] w3m の local CGI 機能 <http://www.mnet.ne.jp/~tnomura/w3m2.html>
- [4] w3m の local CGI その2 <http://www.mnet.ne.jp/~tnomura/localcgi.html>
- [5] <http://www.felix.jp/~yugo/diary/2000_08/diary18.html>
- [16] あとは 2ch の w3m スレの話題にも結構上がります。スクリプトが投稿されていたりもするので参考になるかも。

* 関連

[17] [[ELink]] でも同様の機能が実装されています。

;; [CITE@en[The ELinks Manual]] ([[Petr Baudis, Jonas Fonseca Madsen, Miciah Dashiel Butler Masters]] 著, [CODE[2007-03-18 16:03:15 +09:00]] 版) <http://elinks.or.cz/documentation/manual.html#CONFIG-CGI>

[82] [[Webブラウザー]]やその[[拡張機能]]として [[URL scheme]]
[CODE(URI)@en[[[cgi:]]]]、[CODE(URI)@en[[[cgi+:]]]] といった [[local CGI]]
と類似した機能が実装されていることもあります。

* 歴史

[19] [[Web Forms 2.0]] には [CODE(URI)@en[[[file:]]]] [[URL]] への[[フォーム提出]]を [[CGI]]
により処理することに
([[参考]]としてではありますが) 言及がありました。 (現在の [[HTML Standard]] にはありません。)

[REFS[
- [20] [CITE@en-GB-x-Hixie[Web Forms 2.0]] ([TIME[2009-01-05 11:07:15 +09:00]] 版) <https://www.whatwg.org/specs/web-forms/current-work/#for-file>
]REFS]


[21] [CITE@en[lynx(1) - Linux man page]]
([TIME[2020-10-01T08:27:18.000Z]])
<https://linux.die.net/man/1/lynx>

[22] [CITE[w3m manual]]
([TIME[2001-11-27T03:32:53.000Z]], [TIME[2020-10-01T08:28:26.484Z]])
<http://w3m.sourceforge.net/MANUAL.ja.html#LocalCGI>