• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPで動的URLを静的URLに変換するには)

PHPで動的URLを静的URLに変換するやり方

このQ&Aのポイント
  • PHPで動的URLを静的URLに変換する方法について教えてください。
  • 上記のフォームからチェックボックスを複数選択してsubmitしたとき、ブラウザのURLを静的な形式に変換するためのPHPスクリプトを教えてください。
  • mod_rewriteはチェックボックスの数が多い場合には向いていないため、path_infoを使う方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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/x2Mb/ などとジャンプさせます。 http://hoge.example.com/aaa/bbb/.htaccess にRewriteを#4のような内容で書きます するとURLはそのままですが 内部で(path_infoの場合) http://hoge.example.com/aaa/bbb/index.php/abcd/Wqh6/5Uyt/x2Mb/ に変換され 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さんの回答でいいんですがね

ymtyumi
質問者

お礼

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

その他の回答 (5)

noname#87667
noname#87667
回答No.5

>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.'.html'; include $url; # 文字化けするので、ダブルクォーテーションはシングルクォーテーションにしてあります。 はずしていたらごめんなさい。

ymtyumi
質問者

補足

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

回答No.4

#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&blogid=1 さてそれを 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にパラメータを渡し そのパラメータに基づいた結果表示を クライアントに返せると思います。

ymtyumi
質問者

補足

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

回答No.3

意図は URLが長々と見苦しい & 動的ページだとSEO的に不利 と言う事ですよね? チェックボックスが数十個もあるのでしたら GETで送る場合 静的に変換しても http://hoge.example.com/aaa/bbb/ad0/ad1/ad2/sb0/sb1/sb2/以下サブディレクトリが数十個繋がる と言うような見苦しい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/ と言う すっきりした形になります。

ymtyumi
質問者

お礼

ご回答ありがとうございます。 umasikajiroさんのご説明通り、SEO対策が最大の目的です。 そうですよね。やはりチェックボックスの数が多いので、POST送信を検討してみたいと思います。インデックス指定は.htaccessでやってみます。ありがとうございました。

noname#119012
noname#119012
回答No.2

サーバーソフトは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/rewrite1.htm
ymtyumi
質問者

お礼

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

回答No.1

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

ymtyumi
質問者

お礼

ご回答いただき、ありがとうございます。 当初は、サーバーサイドで処理する方法を考えておりましたが、 やはり、ヘッダーで飛ばす方法ぐらいしかないのでしょうか。 できれば、あまり使いたくない方法なものですから、、、すみません。 JavaScriptをはあまり詳しくないので、全く思いつきませんでした。ありがとうございます。これから調べてみようと思います。ちなみにサクッとで結構ですから、どのように書けばいいのか、教えていただけたらうれしいです。