Top/PukiWiki/改造/URL Encodeの代わりにPunycode Encodeを使う

URL Encodeの代わりにPunycode Encodeを使う の変更点はてなブックマーク


-[[通信用語の基礎知識:Punycode]]
-[[RFC3492 プニコード:アプリケーションの国際化ドメイン名(IDNA)のためのユニコードブースティングコーディング>http://www5d.biglobe.ne.jp/~stssk/rfc3492j.html]]

*PukiWikiのURLについての問題
-URLが長い。((階層化し過ぎなので、身から出たさび :p ))
-勝手にURL Decodeするクライアントがいる。

*解決するには
rawurlencodeの代わりに他のエンコード法、例えばPunycode Encodeを使う。((ただ、本来は国際化ドメイン名(IDN)のための技術なので、端から無理があります。))
Punycodeを使うのはASCII文字列が残るから。また何より、[[RFCの例が素晴らしい>http://www5d.biglobe.ne.jp/~stssk/rfc/rfc3492j.html#28]]から :)~

なお、正確には併用となります。Punycodeもどき。

*インストール
**Libidn
[[GNU IDN Library - Libidn - GNU Project - Free Software Foundation (FSF)>http://josefsson.org/libidn/]]
 wget http://josefsson.org/libidn/releases/libidn-0.5.9.tar.gz
 tar xvzf libidn-0.5.9.tar.gz
 cd libidn-0.5.9/
 ./configure
 make
 make install
もしくは
 apt-get install libidn11-dev

**PHP-IDN
[[PHP-IDN (v1.1/Stable) @ Bayour.COM>http://php-idn.bayour.com/]]
 wget http://php-idn.bayour.com/idn_1.1.tar.bz2
 tar xvjf idn_1.1.tar.bz2
 cd idn-1.1/
 phpize
 ./configure
 make
 make install
 ln -s /usr/local/lib/php/extensions/no-debug-non-zts-20020429/idn.so /usr/local/lib/php/extensions/idn.so

 vi /usr/local/lib/php.ini
>
 [php-idn]
 extension="/usr/local/lib/php/extensions/idn.so"
 ;idn.allow_unassigned_chars = "0"
 ;idn.use_std_3_ascii_rules = "0"
 idn.default_charset = "EUC-JP"

phpinfo()で確認。

**パッチ (PukiWiki1.4.4)
#ref(puny_func.diff,,関数を導入するパッチ puny_func.diff)
#ref(puny_repurlenc.diff,,関係がありそうな所を書き換えるパッチ puny_repurlenc.diff)

*静的コンテンツに偽装
[[PukiWiki/改造/静的コンテンツに偽装/ページ]]を参考にお好みで。
**パッチ
#ref(puny_camo_html.diff,,HTMLに偽装)
#ref(puny_camo_dir.diff,,ディレクトリに偽装)

**ディレクトリに偽装した場合の例
このサイトでの例。((今のところpuny_repurlenc.diffの大半を当てていないため、[[]]で作られるリンクのリンク先などは元のまま。))
-[[Linux/Apache/Tips/WebDAV脆弱性狙いのワーム対策]]
|~前|http://cubic9.com/Linux/Apache/Tips/WebDAV%C0%C8%BC%E5%C0%AD%C1%C0%A4%A4%A4%CE%A5%EF%A1%BC%A5%E0%C2%D0%BA%F6/|
|~後|http://cubic9.com/Linux/Apache/Tips/xn--WebDAV-143e2ll9ajexfz816cbyioldf55htn2a6gu/|
-[[PukiWiki/設定/IEでも添付ファイルをブラウザ上に展開させない]]
|~前|http://cubic9.com/PukiWiki/%C0%DF%C4%EA/IE%A4%C7%A4%E2%C5%BA%C9%D5%A5%D5%A5%A1%A5%A4%A5%EB%A4%F2%A5%D6%A5%E9%A5%A6%A5%B6%BE%E5%A4%CB%C5%B8%B3%AB%A4%B5%A4%BB%A4%CA%A4%A4/|
|~後|http://cubic9.com/PukiWiki/xn--mbtt79h/xn--IE-g73avc4a0exaf0szfoglb1a8t2qta73a7a4672lpmde07gse7d6f2j/|
-[[PukiWiki/改造/URL Encodeの代わりにPunycode Encodeを使う]]
|~前|http://cubic9.com/PukiWiki/%B2%FE%C2%A4/URL%20Encode%A4%CE%C2%E5%A4%EF%A4%EA%A4%CBPunycode%20Encode%A4%F2%BB%C8%A4%A6/|
|~後|http://cubic9.com/PukiWiki/xn--zbvy86g/xn--URL%20EncodePunycode%20Encode-4u3xd2ancu8breoe3839iwhe/|

*備考
-パッチを当てた後でもURL Encodeされた文字列は解釈できます。InterWikiはこちらで。
-計算量の割にはメリットが少ないかも。

*関連
-[[Punycodeコンバータ>http://cubic9.com/test/idn/?src=xn--foo..com-s53g3b8wjc%252Fxn--bar-o73bsj&rule=cubic9.com_decode]]

*参考
-[[[PHP-dev 934]Re: 拡張モジュールの作り方について>http://ns1.php.gr.jp/pipermail/php-dev/2003-December/000933.html]]
-[[IDN Conversion Tool: VeriSign>http://mct.verisign-grs.com/conversiontool/index.shtml]]
-[[PHP で idnkit を使いたい>http://www.sera.desuyo.net/idnkit/]]

*関連
-PHP
--[[PEAR :: Package :: Net_IDNA>http://pear.php.net/package/Net_IDNA]]
--[[PHP Classes - Class: IDNA Convert>http://promoxy.mirrors.phpclasses.org/browse/package/1509.html]]
-Perl
--[[search.cpan.org: IDNA::Punycode - encodes Unicode string in Punycode>http://search.cpan.org/~miyagawa/IDNA-Punycode-0.02/lib/IDNA/Punycode.pm]]
--[[search.cpan.org: Encode::Punycode - Encode plugin for Punycode encodings>http://search.cpan.org/~miyagawa/Encode-Punycode-0.02/lib/Encode/Punycode.pm]]
--[[search.cpan.org: Net::LibIDN - Perl bindings for GNU Libidn>http://search.cpan.org/~thor/Net-LibIDN-0.07/_LibIDN.pm]]
--[[search.cpan.org: Net::IDN::Encode - Encoding/Decoding of Internationalized Domain Names (IDNs).>http://search.cpan.org/~cfaerber/Net-IDN-Encode-0.02/Encode.pm]]

*コメント等ありましたらどうぞ :)
#pcomment(,5,reply)

*Amazon
#amazon(4798109223,left)
#amazon(479733245X,left)
#amazon(4798119865,left)
~
日本語.com/netは[[バリュードメイン>Devel/ドメイン/バリュードメイン]]なら990円。
差分 一覧