プロが教える店舗&オフィスのセキュリティ対策術

PHPで動的URLを静的URLに変換するやり方を教えてください。

<form method="GET" action="aaa/bbb">
<input type="checkbox" name="ad" value="0">
<input type="checkbox" name="ad" value="1">
<input type="checkbox" name="ad" value="2">

<input type="checkbox" name="sb" value="0">
<input type="checkbox" name="sb" value="1">
<input type="checkbox" name="sb" value="2">

<input type="submit" value="送信">
</form>

上記のフォームからチェックボックスを複数選択してsubmitしたとき、
ブラウザのURLはhttp://www.hogehoge.com/aaa/bbb?ad=1&sb=2
となっていたとします、
これをhttp://www.hogehoge.com/aaa/bbb/1/2
と書き換えるにはどんなPHPスクリプトを書けばよいのでしょうか?

実際はもっとチェックボックスの数が多いので、
mod_rewrite は不向きのように思います。
そうすると、path_info を使うのが良いと思うのですが、
具体的にどのようにコーディングすればいいか分かりません。
お手数ですが、回答をお願いいたします。

A 回答 (6件)

力量不足で実際のスクリプトは私には書けない事は了解されていますね?


>http://hoge.example.com/aaa/bbb/z10Hqwd/​などへヘッダーで飛ばすというようなやり方になるのでしょうか?

FORMを受けるのと表示するのの2つスクリプトにした方が作りやすいかなあ?
formを受けるphpなりCGIなりはRewriteの影響を受けない別のディレクトリに置いた方が判りやすそうです
例:
http://hoge.example.com/aaa/bbb/index.php が表示するphp
http://hoge.example.com/ZZZ/encode.php がFORMを受けるPHP

encode.php の役目:
formから受けた場合 =>上から(と言うか配列の添え字の順番に)On/Offの判定をして
まず2進数 に変換します。
たしか2進数だとPHPでは31桁までじゃ無かったかなあ? と思うので
例えば20桁づつ 4つの 2進数の数値にします。
それを16進数ないし62進数に変換した値を得ます

 ここでよくよく考えたら62進数でも思ったほど短くなりませんね
 16進数で20桁だと 16の2乗である256進数で半分の10桁の筈ですから
 62進数でも16~17桁? ぐらいかな? 以下16桁と仮定します。

abcd Wqh6 5Uyt x2Mb と言う4桁づつX4の62進数の値が得られたとします。
それをURLとして
Location: http://hoge.example.com/aaa/bbb/abcd/Wqh6/5Uyt/x …
などとジャンプさせます。
http://hoge.example.com/aaa/bbb/.htaccess にRewriteを#4のような内容で書きます
するとURLはそのままですが 内部で(path_infoの場合)
http://hoge.example.com/aaa/bbb/index.php/abcd/W … に変換され
index.php で /abcd/Wqh6/5Uyt/x2Mb/ と言う値を取得することが出来ます。
ここから下がindex.phpの仕事ですが
/abcd/Wqh6/5Uyt/x2Mb/ =>abcd Wqh6 5Uyt x2Mb=>さらに2進数に
それでどのチェックボックスがチェックされたのかが判りますので、それに応じたページを表示します。
尚、index.phpはパラメーターが取得できない場合 (つまり http://hoge.example.com/aaa/bbb/ にアクセスされた場合)は
<FORM ACTION= "/ZZZ/encode.php"
以下 チェックボックス表示
として FORM表示するようにします
 (さもないと項目を変えるたびに FORM文を書くHTMLもindex.phpも両方書き換える羽目になります)

以下 私は数字にも弱いので間違えているかもしれませんが
因みにチェックボックスが80個ですべての組み合わせは 2の80乗になると思います。
これを10進法で表すと (計算違いなら突っ込みヨロシク)
1,208,925,819,614,629,174,706,176 通りと言うまさに天文学的な数字(25桁)

チェックボックスがせいぜい4つか5つなら #5さんの回答でいいんですがね
    • good
    • 0
この回答へのお礼

できました!

詳細なご説明とアドバイスをいただき本当にありがとうございました。
umasikajiro様の回答をもとに動的ページ→静的ページにすることができました。

ありがとうございます。

お礼日時:2008/07/02 00:53

>PHPで動的URLを静的URLに変換するやり方を教えてください。


>ブラウザのURLはhttp://www.hogehoge.com/aaa/bbb?ad=1&sb=2となっていたとします
>これをhttp://www.hogehoge.com/aaa/bbb/1/2と書き換える

この辺で認識がずれていると話にならないので、2点確認させてください。
・「aaa/bbb?ad=1&sb=2」は「aaa/bbb.php?ad=1&sb=2」のtypoですか?
・「aaa/bbb/1/2と書き換える」ということは、この下にindex.htmlがあるということですか?

前者の場合は、bbb.phpの中でGET変数を使ってHTML出力をする仕組みにしているなら、多分mod_rewriteを使わないとできないと思います。

ただ、後者の場合、静的ファイルがチェックボックスの個数分用意されているのであれば、「http://www.hogehoge.com/aaa/bbb/1_2.html」というURLを作ってincludeすればいいだけのような気がします。例えば、こんな感じです($_GET変数のサニタイジング処理は省略します)。
$ad = $_GET['ad']; ←$_GET['ad']=1と仮定
$sb = $_GET['sb']; ←$_GET['sb']=2と仮定
$url = 'http://www.hogehoge.com/aaa/bbb'.$ad.'_'.$sb.'.h …
include $url;
# 文字化けするので、ダブルクォーテーションはシングルクォーテーションにしてあります。

はずしていたらごめんなさい。

この回答への補足

ご回答いただきありがとうございます。
質問の内容が不十分で申し訳ありません。
「aaa/bbb?ad=1&sb=2」は「aaa/bbb.php?ad=1&sb=2」のタイプです。
この場合、mod_rewriteを使わないとできないのではないかとのことですが、
簡単で結構ですので、記述方法を教えていただけないでしょうか?
お手数ですが、宜しくお願いいたします。

補足日時:2008/06/30 18:28
    • good
    • 0

#3のでは 考え方が逆か?


phpやcgiにパラメータを与えた結果表示のページを SEO有利にしたいと言うことですね
で、80もチェックボックスがあるとなると 、、、判りません と言うか私では力不足です

一応考え方のみを書いてみます。
ラジオボタンではなくcheckboxで複数選択可なのでnameは全てユニークなものにします
例:
<input type="checkbox" name="ad0">
<input type="checkbox" name="ad1">
<input type="checkbox" name="ad2">
"ad0" や "sb1"は順番に配列に入れておきます
それぞれのnameごと(配列の各要素ごと)のチェックOn/Offは 0と1に つまり2進数に置き換えることが出来ます

例えばチェックボックス3つだけと仮定したら
上の例で ad0 とad2 がOnで ad1 がoffの場合
101 と言う数値に置き換えることが出来ます。
で、その2進数のパラメータを URLから受け取るために
例えばPATH_INFOを使うとして そのまま2進数で80桁だと またまた見苦しい事態になります
そこで 短くするために 16進数を 用います
例えば http://hoge.example.com/aaa/bbb/index.php/F9 でしたら
index.phpに 16進数 0xF9 が渡り 2進数だと 11111001 となり
1~5番目と8番目のチェックボックスがONで 6,7番目がOFF と言うことに成ります

16進数は2進数の1/4の桁数で済むはず(だと思ったけど?)ですから checkbox数80でしたら
20桁で済みます

或いは16進数ではなく0~9 A~Z a~z で数値を表す62進数 ならばもっと短くできますね
と思ったら ↓ここにそれらしきものが
http://www.123net.jp/dev/?query=62&amount=0&blog …

さてそれを Rewriteで静的=>動的変換する場合ですが
http://hoge.example.com/aaa/bbb/ に .htaccess を置くのなら
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/aaa/bbb/index.php
RewriteRule ^(.*)$ /aaa/bbb/index.php/$1 [L]

queryで引数渡しならば
RewriteRule ^(.*)$ /aaa/bbb/index.php?$1 [L]
ですね

これで62進数でうまくいけば
http://hoge.example.com/aaa/bbb/z10Hqwd/ なんてURLにアクセスしてブラウザにはそのURLを表示したまま
実体は
http://hoge.example.com/aaa/bbb/index.php/z10Hqwd/ にアクセスして
index.phpにパラメータを渡し
そのパラメータに基づいた結果表示を クライアントに返せると思います。

この回答への補足

詳細なご説明ありがとうございます。
umasikajiro様のご指摘の通り、actionで指定した送信先のページをSEOに有利にしたい
という意図ですので、get送信が理想的です。
各チェックボックスのOn/Offを0か1かの2進数に置き換えて、されにそれを
62進数に変換してパラメータとしてセットするというところは理解できるのですが、
根本的なことが理解できていないので、質問させてください。
そもそもチェックボックスのOn/Offを判定する為には、一度submitをかける必要がありますよね?
つまり、チェックボックスのOn/Offを判定する判定用のPHPなどを介してパラメータをセットして
http://hoge.example.com/aaa/bbb/z10Hqwd/などへヘッダーで飛ばすというようなやり方になるのでしょうか?
勉強不足で申し訳ありませんが、宜しくお願いいたします。

補足日時:2008/06/30 18:18
    • good
    • 0

意図は URLが長々と見苦しい & 動的ページだとSEO的に不利 と言う事ですよね?


チェックボックスが数十個もあるのでしたら GETで送る場合
静的に変換しても
http://hoge.example.com/aaa/bbb/ad0/ad1/ad2/sb0/ …以下サブディレクトリが数十個繋がる
と言うような見苦しいURLに成りますよ?

Form をGETではなく POSTで送って index.phpなり index.cgiなりを インデックスに指定すれば済む問題かと思います。
HTML文は
<form method="POST" action="/aaa/bbb/">

有効な .htaccess または httpd.confの該当Directoryコンテナに
Directoryindex index.php
または
Directoryindex index.cgi index.php

これで FORMを送れば URLは
http://hoge.example.com/aaa/bbb/
と言う すっきりした形になります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
umasikajiroさんのご説明通り、SEO対策が最大の目的です。

そうですよね。やはりチェックボックスの数が多いので、POST送信を検討してみたいと思います。インデックス指定は.htaccessでやってみます。ありがとうございました。

お礼日時:2008/06/28 01:28

サーバーソフトはapacheでしょうか。


PHPでという回答にはなりませんが、apacheのRewrite機能(RewriteRule)を使うと実現可能かと思います。
簡単に説明しますと、
1.apacheへ送られてきたリクエストURLをRewriteRule句の正規表現で置換
2.置換後のURLへリダイレクト
といった感じになります。

※)つまり、apacheからしてみれば2回リクエストを受けることになります。(1回目はURLを置換してリダイレクト、2回目は置換後のURLを処理)

正規表現の組み方次第で色々な事ができます。

実際、自分が過去に関わった案件で同様の要件があり使った手です。
ただサーバーを共有していて、かつ他のサービスが稼働中の場合・・・
apacheの再起動が必要になるので実装は拒まれるかもしれません。

参考URL:http://www.nurs.or.jp/~sug/homep/rewrite/rewrite …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
サーバーソフトはapacheです。
もう少し教えて頂きたいのですが、
チェックボックスは80個くらいあって、複数選択可能なんですが、
どのチェックボックスが、いくつ選択されるか分からないので、
想定されるパラメータの組み合わせを正規表現で全て記述しないといけないのでしょうか?汎用的な記述方法ってありますか?

お礼日時:2008/06/25 13:51

サーバーサイドかクライアントサイド、どちらでURLを生成するかにより、記述方法が変わってくると思います。


サーバーサイドで処理するならば、単純にPHPで$_GET['ad']、$_GET['sb']でURLを生成して、ヘッダーで飛ばしてしまえばいいだけだと思いますが、クライアントサイドでURLを生成する場合だと、PHPではなくて、JavaScriptを使えばよろしいんではないでしょうか?
要はチェックボックスに入力されたら自動的にその値からURLを生成してaction=""に挿入させれば、http://www.hogehoge.com/aaa/bbb/1/2
のような事は可能だと思います。
    • good
    • 0
この回答へのお礼

ご回答いただき、ありがとうございます。
当初は、サーバーサイドで処理する方法を考えておりましたが、
やはり、ヘッダーで飛ばす方法ぐらいしかないのでしょうか。
できれば、あまり使いたくない方法なものですから、、、すみません。

JavaScriptをはあまり詳しくないので、全く思いつきませんでした。ありがとうございます。これから調べてみようと思います。ちなみにサクッとで結構ですから、どのように書けばいいのか、教えていただけたらうれしいです。

お礼日時:2008/06/25 13:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!