Web サイトのミラーを構築しようとした場合に、再起して取得するコンテンツの URL に含まれる ~ が %E2%80%BE (U+203E: OVERLINE) 扱いされて、ローカルのフォルダが変になることがある。
具体的には、以下のような感じ。
ところが再起して取得するコンテンツは、一旦 ~ を %E2%80%BE 扱いして失敗した後、再度 ~ にトライし、成功した場合でも、前者ではなく後者のディレクトリに格納するという動作をしている。
まず、--restrict-file-names オプションでもどうに出来ないか試してみたが、
IRI 対応で %E2%80%BE, ~ の順に試行する動作は変わらないため、
--restrict-file-names=nocontrol オプションを使うと、
次に、--local-encoding, --remote-encoding オプションを試してみたところ改善が見られた。
どうもこれは Internationalized Resource Identifier (IRI) 周りの対応で妙な事になってる雰囲気。
少なくとも、以下の条件で、ミラーを構築させようとした場合には発生する模様。
対策としては、以下の3つの対応のうちいずれか1つを行なえば回避出来ることを確認した。
以上の症状等は、以下の2つの環境で確認した。
関連:
具体的には、以下のような感じ。
$ wget -m -np http://foo.bar/~hoge/index.html --2014-02-15 14:33:18-- https://foo.bar/~hoge/index.html foo.bar (foo.bar) をDNSに問いあわせています... 127.0.0.1 foo.bar (foo.bar)|127.0.0.1|:443 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 40673 (40K) [text/html] `foo.bar/~hoge/index.html' に保存中 100%[======================================>] 40,673 --.-K/s 時間 0.08s 2014-02-15 14:33:19 (513 KB/s) - `foo.bar/~hoge/index.html' へ保存完了 [40673/40673] --2014-02-15 14:33:27-- https://foo.bar/%E2%80%BEhoge/screen.css foo.bar:443 への接続を再利用します。 HTTP による接続要求を送信しました、応答を待っています... 404 Not Found 2014-02-15 14:33:28 エラー 404: Not Found。 --2014-02-15 14:33:28-- https://foo.bar/~hoge/screen.css foo.bar:443 への接続を再利用します。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 11886 (12K) [text/css] `foo.bar/\342%80\276hoge/screen.css' に保存中 100%[======================================>] 11,886 --.-K/s 時間 0.001s 2014-02-15 14:33:28 (22.0 MB/s) - `foo.bar/\342%80\276hoge/screen.css' へ保存完了 [11886/11886]以下の2つのディレクトリが掘られている。
- foo.bar/~hoge
- foo.bar/%80hoge
ところが再起して取得するコンテンツは、一旦 ~ を %E2%80%BE 扱いして失敗した後、再度 ~ にトライし、成功した場合でも、前者ではなく後者のディレクトリに格納するという動作をしている。
まず、--restrict-file-names オプションでもどうに出来ないか試してみたが、
IRI 対応で %E2%80%BE, ~ の順に試行する動作は変わらないため、
--restrict-file-names=nocontrol オプションを使うと、
- foo.bar/~hoge
- foo.bar/‾hoge
- foo.bar/~hoge
- foo.bar/%E2%80%BEhoge
次に、--local-encoding, --remote-encoding オプションを試してみたところ改善が見られた。
どうもこれは Internationalized Resource Identifier (IRI) 周りの対応で妙な事になってる雰囲気。
少なくとも、以下の条件で、ミラーを構築させようとした場合には発生する模様。
- サーバー側のファイル名エンコーディングは EUC-JP
- http response header は Content-Type: text/html
- html は <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
- ローカルの環境変数は LANG=ja_JP.UTF-8
対策としては、以下の3つの対応のうちいずれか1つを行なえば回避出来ることを確認した。
- --remote-encoding オプションに ASCII, EUC-JP, UTF-8 のいずれかを与える
- --no-iri オプションを与える
- 環境変数を LANG=C にする
以上の症状等は、以下の2つの環境で確認した。
$ uname -a CYGWIN_NT-5.1 baraduke 1.7.27(0.271/5/3) 2013-12-09 11:57 i686 Cygwin $ wget --version GNU Wget 1.13.4 built on cygwin. +digest +https +ipv6 +iri +large-file +nls -ntlm +opie +ssl/gnutls Wgetrc: /etc/wgetrc (system) ロケール: /usr/share/locale コンパイル: gcc-4 -DHAVE_CONFIG_H -DSYSTEM_WGETRC="/etc/wgetrc" -DLOCALEDIR="/usr/share/locale" -I. -I/usr/src/wget-1.13.4-1/src/wget-1.13.4/src -I../lib -I/usr/src/wget-1.13.4-1/src/wget-1.13.4/lib -g -O2 -pipe リンク: gcc-4 -g -O2 -pipe -liconv -lintl /usr/lib/libgnutls.dll.a /usr/lib/libtasn1.dll.a /usr/lib/libz.dll.a /usr/lib/libgcrypt.dll.a /usr/lib/libgpg-error.dll.a /usr/lib/libintl.dll.a -L/usr/lib/ncursesw /usr/lib/libiconv.dll.a -lgcrypt -lgpg-error -lz -lidn ftp-opie.o gnutls.o ../lib/libgnu.a Copyright (C) 2009 Free Software Foundation, Inc. ライセンス GPLv3+: GNU GPL バージョン 3 あるいはそれ以降のバージョン <http://www.gnu.org/licenses/gpl.html>. このソフトウェアはフリーソフトウェアです。自由に変更、再配布ができます。 法律が許すかぎり、全くの無保証です。 Hrvoje Niksic <hniksic@xemacs.org> によって書かれました。 バグ報告や質問は<bug-wget@gnu.org>へ
$ uname -a Linux ubuntu-server-v1 3.2.0-58-virtual #88-Ubuntu SMP Tue Dec 3 17:58:13 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux $ wget --version GNU Wget 1.13.4 built on linux-gnu. +digest +https +ipv6 +iri +large-file +nls +ntlm +opie +ssl/openssl Wgetrc: /etc/wgetrc (system) ロケール: /usr/share/locale コンパイル: gcc -DHAVE_CONFIG_H -DSYSTEM_WGETRC="/etc/wgetrc" -DLOCALEDIR="/usr/share/locale" -I. -I../../src -I../lib -I../../lib -D_FORTIFY_SOURCE=2 -Iyes/include -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -DNO_SSLv2 -D_FILE_OFFSET_BITS=64 -g -Wall リンク: gcc -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -DNO_SSLv2 -D_FILE_OFFSET_BITS=64 -g -Wall -Wl,-Bsymbolic-functions -Wl,-z,relro -Lyes/lib -lssl -lcrypto -lz -ldl -lz -lidn -lrt ftp-opie.o openssl.o http-ntlm.o ../lib/libgnu.a Copyright (C) 2009 Free Software Foundation, Inc. ライセンス GPLv3+: GNU GPL バージョン 3 あるいはそれ以降のバージョン <http://www.gnu.org/licenses/gpl.html>. このソフトウェアはフリーソフトウェアです。自由に変更、再配布ができます。 法律が許すかぎり、全くの無保証です。 Hrvoje Niksic <hniksic@xemacs.org> によって書かれました。 バグ報告や質問は<bug-wget@gnu.org>へ
関連:
タグ
コメントをかく