日本語ファイル名を含むURLからのダウンロードについて調べてみた。
1, やりたい事
http://localhost/日本語ファイル名.pdf
みたいな日本語名のファイルをダウンロードしたい
2, 対策その1
phpのurlencode()で、日本語をURLエンコードすればいいのね。知ってる分かっている!
http://localhost/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D.pdf
と思ったら、URLが文字化けしていて404エラー。なぜ!?
3, 調査
URLの文字コード(ファイル名)を、shift-jis→URLエンコードしたら、ちゃんとダウンロードできた。
ChromeなどではURL欄に日本語を手入力すると、UTF-8→URLエンコードするので、結果として違う文字列になる。
変換サイト:http://urlencode.net/result.cgi
OK http://localhost/%93%FA%96%7B%8C%EA%83t%83%40%83C%83%8B%96%BC.pdf (shift-jis)
NG http://localhost/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D.pdf (UTF-8)
※shift-jisは2バイト、UTF-8は3バイトなので、1.5倍量の文字列になっている事が分かる。
4, 対策その2
よく分からんけど、apacheの文字コードの問題なのか?
1 2 |
vi /etc/httpd/conf/http.conf #AddDefaultCharset UTF-8 |
コメントアウト解除して再起動してみたけど変わらず。
※そもそもapache2.2はデフォルトでUTF-8らしいので、当たり前!
5, 推測
apacheのaccesslogファイルを調べてみても、GETの段階でOK/NGがハッキリしている。
shift-jisをURLエンコードした文字列だとOK
“GET /desk/data/pdf/5/%93%FA%96%7B%8C%EA%83t%83%40%83C%83%8B%96%BC.pdf HTTP/1.1” 200
UTF-8をURLエンコードした文字列だとNG
“GET /desk/data/pdf/5/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D.pdf HTTP/1.1” 404
これって、やっぱりapacheの設定の問題だよな…。でも、どこを修正すればいいのだろうか。
6, 対策その3
とりあえず、上手く動いているhttp.confと比較してみた。
Include conf.d/*.conf直下にある以下の記述が怪しい!!
1 2 3 4 5 |
LoadModule encoding_module modules/mod_encoding.so EncodingEngine on SetServerEncoding SJIS DefaultClientEncoding JA-AUTO-SJIS-MS SJIS |
mod_encoding.soは、標準でインストールされていないみたいなので、下記のサイトを参考にインストールして、apache再起動
http://linuxserver.jp/%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89/httpd/webdav%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%82%92%E8%A7%A3%E6%B6%88
参考サイトその2
http://khigasblog.blogspot.jp/2009/09/apache.html
7, 結果
上記の修正で、リンクやURL欄に http://localhost/日本語ファイル名.pdf と直接記述しても、ファイルへのリンクが有効になった!
やれやれ、URLに日本語は使って欲しくないけど、ファイル名が半角英数字のみって訳にも行かないから困ったものだ。
8, 備考
URLエンコードの元の文字コードとかって、あまり意識した事無かったけど、こういう時は切実だよな~。
まあ、いい勉強になった。