[1] [[FTP]] を使う場合に、[[クライアント]]と[[串]]の間の通信に [[HTTP]] を用いることがあります。
これはしばしば [DFN[[[FTP over HTTP]]]] と呼ばれています。[[串]]は、 [[HTTP]] と [[FTP]]
の[[アプリケーション層プロトコル]]翻訳器 ([[関門]]) として動作します。

* 呼称

[30] 
[[FTP over HTTP]] が最も普及した名称とみられます。
正式名称といえるものはなく、
特別な名称なくふわっと使われていることも多いです。

[2] [[クライアント]]と[[串]]の間は [[FTP]] ではなく [[HTTP]] なので、
厳密には「[[over]]」というべきではないかもしれませんが、この名前が広く慣用されており、
他により適切で普及した名称もありません。

* 仕様書

[31] 
[[FTP over HTTP]] の挙動や応用を明確に規定する[[仕様書]]は見当たりません。
[[平成時代]]の
[[Webブラウザー]]に遍く実装された[[事実上の標準]]でした。

* プロトコル

[8] [[要求URL]] には [CODE(URI)@en[[[ftp:]]]] [[URL scheme]] の[[絶対URL]]
を使います [SRC[>>5, >>7]]。

[9] [CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]には[[要求URL]]
の[[ホスト]]の部分を使います [SRC[>>5, >>7]]。[[FTP]] の[[既定のポート番号]]である
[CODE[[[21]]]] を明示しなければならない [SRC[>>7]] (そうしないと [[HTTP]]
の[[既定のポート番号]]である [CODE[[[80]]]]) と説明するものもあれば、
特に言及のない説明もあり、どう解釈されるのか定かではありません。実装により異なるのかもしれません。

;; [18] [[HTTP]] 本体仕様によれば[[絶対URL]]を[[要求URL]]とする場合でも、
[CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]は必須です。しかし[[サーバー]]は[[絶対URL]]
を採用し、 [CODE(HTTP)@en[[[Host:]]]] [[ヘッダー]]は無視しなければならないことになっています。
([[実効要求URL]]参照。)

[10] [[認証]]は、[[HTTP]] [[基本認証]]の他、[[要求URL]]の [[userinfo]]
部分の指定でも良いようです [SRC[>>5]]。しかし[[認証]]を扱えないものや記号が含まれると正しく処理できないもの
([[クライアント]]や[[鯖]]) など、[[相互運用性]]は高くないようです [SRC[>>7]]。

[12] [CODE(HTTP)@en[[[GET]]]] によりファイルを[[ダウンロード]]できます [SRC[>>5, >>11]]。

[13] 実装によっては [CODE(HTTP)@en[[[PUT]]]] によりファイルを[[アップロード]]できます
[SRC[>>5]]。

[24] [[ディレクトリー]]を [CODE(HTTP)@en[GET]] すると、
[[Webブラウザー]]からの直接アクセスで[[ディレクトリー]]を開いた場合のように、
[[ディレクトリー]]内の[[ファイル]]一覧の[[HTML文書]]を返します。

[32] 
そのような [[HTTP要求]]を受信した[[プロキシ]]は、
[[FTP]] を使って指定された[[上流]] [[FTP]] サーバーにアクセスすることもできますし、
[[HTTP]] のまま[[上流]] [[HTTP]] プロキシに[[転送]]することもできます。
(し、エラーとして拒絶することもできます。)

* 実装

[3] [[Web]] 系の[[利用者エージェント]]や[[鯖]]で [[FTP]] に対応するものの多くは、
本方式にも対応しているようです。
ただし
[[Webブラウザー]]からは [[FTP]]
対応全体が削除されつづあります。
[SEE[ [CODE[ftp:]] ]]

[29] 
昔ながらの中継用の[[プロキシ]]や、
[[セキュリティー]]系の[[プロキシ]]などに対応例がみられます。


[4] [[FTP]] [[クライアント]]は本方式に対応していないものが多いようです。

* メモ

[33] 
[[クライアント]]にとっては [[HTTP]] さえ実装すれば [[FTP]]
に対応する必要がなくなるので便利なのですが、
[[FTP over HTTP]] プロキシが手近に利用できるとは限らないので、
結局 [[FTP]] も実装しないと使い物にならないという不便があります。

[FIG(amazon)[
[[FTP]]
]FIG]

[REFS[
- [5] [CITE@ja[Use telnet '''['''telnet雑技室''']''']] ([TIME[2005-02-24 21:18:33 +09:00]] 版) <http://www.nurs.or.jp/~telnet/tips.html>
- [6] [CITE@ja[wgetのFTPプロキシ | tuneoの日記 | スラッシュドット・ジャパン]] ([TIME[2015-03-16 17:31:45 +09:00]] 版) <http://slashdot.jp/~tuneo/journal/445012/>
- [7] [CITE@ja[FTP over HTTP Explained | McAfee Communities]] ([TIME[2015-03-16 17:31:52 +09:00]] 版) <https://community.mcafee.com/docs/DOC-4921>
- [11] [CITE@en[mod_proxy_ftp - Apache HTTP Server Version 2.4]] ([TIME[2015-01-02 00:30:56 +09:00]] 版) <http://httpd.apache.org/docs/2.4/mod/mod_proxy_ftp.html>
- [14] [CITE@ja[UNIX:WINDOWS:FTP over HTTP通信の取り扱い方について | サポート Q&A:トレンドマイクロ]] ([[Trend Micro - Core Web Development MUC ;-)]] 著, [TIME[2015-03-16 17:38:47 +09:00]] 版) <http://esupport.trendmicro.com/solution/ja-jp/1304243.aspx>
]REFS]

[16] >>15 は逆に [[FTP]] の要求を受信して [[HTTP]] に変換して処理するようです。

[REFS[
- [15] [CITE[Features/FtpRelay - Squid Web Proxy Wiki]] ([TIME[2015-03-16 17:42:06 +09:00]] 版) <http://wiki.squid-cache.org/Features/FtpRelay>
]REFS]

[17] [CODE(URI)@en[[[gopher:]]]] や [CODE(URI)@en[[[wais:]]]] も同じように[[串]]まで
[[HTTP]] で通信していたかもしれません。

[19] [CITE[Issue 11227 - chromium - FTP not working behind (HTTP) Proxy - An open-source project to help move the web forward. - Google Project Hosting]]
([TIME[2015-03-22 01:00:14 +09:00]] 版)
<https://code.google.com/p/chromium/issues/detail?id=11227>

[20] [CITE@en[112507 – not asked for password when ftp://user@host through a proxy server]]
([TIME[2015-08-28 18:37:01 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=112507>

[FIG(quote)[
[FIGCAPTION[
[22] [CITE@en[195242 – Chimera sends HTTP commands to FTP proxy when accessing FTP URLs]]
([TIME[2015-08-28 18:44:28 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=195242>
]FIGCAPTION]

> Fetch supports 8 different FTP-proxy
> protocols.  ncftp supports 7.  That's probably part of the reason IE simply uses
> the HTTP proxy and Safari punts on ftp URLs.

]FIG]


[FIG(quote)[
[FIGCAPTION[
[23] [CITE@ja[HTTP:FTP over HTTPでURLにパスワードを指定できない | サポート Q&A:トレンドマイクロ]]
([[Trend Micro - Core Web Development MUC ;-)]] 著, [TIME[2015-12-26 17:00:16 +09:00]] 版)
<http://esupport.trendmicro.com/solution/ja-jp/1305963.aspx>
]FIGCAPTION]

> FTP over HTTPのパスワード設定でユーザ名とパスワードを設定していた場合に、ftp://user:pass@ftp.abc.com/形式でのアクセスをした際にuser,passではなく設定ファイルにて設定されたユーザー名、パスワードでのアクセスになってしまう。
> ver. 3.6 Patch1での既知問題となっております。
> 本問題に関しましてはver. 3.6 Patch2にて解決しております。

]FIG]


[FIG(quote)[
[FIGCAPTION[
[25] [CITE[lftp.1]]
( ([TIME[2016-05-19 18:00:12 +09:00]]))
<http://lftp.yar.ru/lftp-man.html>
]FIGCAPTION]

> HFTP is ftp-over-http-proxy protocol.  It  can  be  used
>        automatically instead of FTP if ftp:proxy is set to `http://proxy'''[''':port''']''''.

]FIG]


[26] [CITE@en[Issue 11227 - chromium - FTP not working behind (HTTP) Proxy - Monorail]]
( ([TIME[2016-06-11 12:41:57 +09:00]]))
<https://bugs.chromium.org/p/chromium/issues/detail?id=11227>

[27] [CITE@en[Issue 310456 - chromium - FTP not working behind Authenticating HTTP Proxy using NTLM (Forefront TMG) - Monorail]]
( ([TIME[2016-06-11 12:44:38 +09:00]]))
<https://bugs.chromium.org/p/chromium/issues/detail?id=310456>

[FIG(quote)[
[FIGCAPTION[
[28] [CITE@en[Deprecate FTP support - Chrome Platform Status]]
([TIME[2019-08-21 13:58:00 +09:00]])
<https://chromestatus.com/feature/6246151319715840>
]FIGCAPTION]

> A bug in Google Chrome 74+ resulted in dropping support for accessing FTP URLs over HTTP proxies. Proxy support for FTP was removed entirely in Google Chrome 76.

]FIG]
