ノウハウ色々
モジュールいろいろ
リンク集
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー


当サイト構築活用本
  (amazonリンク)

XOOPSコミュニティサイト構築ガイド

Customizing XOOPS

Googleマップ+Ajaxで自分の地図をつくる本

PHPサイバーテロの技法―攻撃と防御の実際

メイン
   《01》XOOPSノウハウなど
     長いurlの圧縮エンコード

スレッド表示 | 古いものから 前の記事 | 次の記事 | 下へ
話題
長いurlの圧縮エンコード
投稿者: fanrun7     投稿日時: 2008-7-25

 森を走ろう!を改造中に長いurlを使うことにした。Firefox,Safari,Operaはurlの
長さ制限は特にないのだが、IEはver7になっても相変わらず2083バイトという制限がある。

 今回の用途では、そんなに長くならないと思っていたが、実際のデータをrawurlencode
してみたら軽く2000バイトを超えてしまった。そこでrawurlencodeの前にbase64_encode
をかけたら大分短くはなるが安心できるまではいかなかった。今回の文字列の特徴を考慮した
仕組みを作ろうかとも一瞬考えたが、面倒なので、もう少し考えてみた。
 gzcompress+base64_encode+rawurlencodeと3重変換したら、
3000バイト近かったものが、1000バイトあまりになった。まあ、これならOKとできる。

 これで良し!と試してみたら、なんと今度はSafariでうまく表示されない。調べてみると、
Firefox,IE,Operaでは$_SERVER['QUERY_STRING']に値をgzcompress+base64_encode
したものが入っているのだが、Safariではそうではないのです。なんと、Safariが
base64_encodeもgzcompressもデコードして、その上でブラウザのencodeをかけてきているのです。

 さて、どうしたものか?各変換で使われいる文字セットを考えて、もうひとつ最後に'%'
を'_'に変換するようにしました。ブラウザには一切、解釈させないという方針です。
結果、どのブラウザでもOKになりました。

 myEncode、myDecodeというfunctionにまとめてみました。変数名とその値をarrayにして使用します。


function myEncode($varray){			// array => encoded_text
		$text = "";
		$str_from = array('/=/','/&/');
		$str_to   = array('_ZEQUALZ_','_ZAMPZ_');
		foreach($varray as $key => $value){
			$text .= "$key=".preg_replace($str_from,$str_to,$value)."&";
		}
		return preg_replace('/%/','_',
					rawurlencode(base64_encode(gzcompress($text,9))));
}

function myDecode($text){				// encoded_text => array
		$str_from = array('/_ZEQUALZ_/','/_ZAMPZ_/');
		$str_to   = array('=','&');
		$text_decoded = gzuncompress(base64_decode(
					rawurldecode(preg_replace('/_/','%',$text))));
		parse_str($text_decoded,$varray);
		foreach($varray as $key => $value){
			$varray["$key"] = preg_replace($str_from,$str_to,$value);
		}
		return $varray;
}


スレッド表示 | 古いものから 前の記事 | 次の記事 | トップ
Copyright(c) 1996-2010 森を走ろう企画    powered by XOOPS