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

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

PHPで動的URLを静的URLに変換するには

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 を使うのが良いと思うのですが、 具体的にどのようにコーディングすればいいか分かりません。 お手数ですが、回答をお願いいたします。

  • PHP
  • 回答数6
  • ありがとう数8

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

  • ベストアンサー
回答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をはあまり詳しくないので、全く思いつきませんでした。ありがとうございます。これから調べてみようと思います。ちなみにサクッとで結構ですから、どのように書けばいいのか、教えていただけたらうれしいです。

関連するQ&A

  • URLに付く [ ] を外したい

    現在稼働中のWebシステムの保守を担当しています。 先日、お客様から「URLに付いている [ ] を消して欲しい」との依頼がありましたが、 やり方が分からず、困っております。 現在、 xxx/aaa[]/1,2,3/bbb[]/1,2,3/ このようになっているURLを xxx/aaa/1,2,3/bbb/1,2,3/ に変更したいという依頼です。 現在、以下のようなフォームがあり <form action="xxx.php" method="GET"> <input type="checkbox" name="aaa[]" value="1"> <input type="checkbox" name="aaa[]" value="2"> <input type="checkbox" name="aaa[]" value="3"> <input type="checkbox" name="bbb[]" value="1"> <input type="checkbox" name="bbb[]" value="2"> <input type="checkbox" name="bbb[]" value="3"> </form> このフォームを送信するとURLは以下のようになりますが、 xxx.php?aaa[]=1,2,3&bbb[]=1,2,3 これを .htaccess で xxx/aaa[]/1,2,3/bbb[]/1,2,3/ というように書き換えています。 このURLを、 xxx/aaa/1,2,3/bbb/1,2,3/ に変更することはできますでしょうか? html、.htaccess、php、どの部分が改修になっても構いません。 [ ] を削除したいという理由としては、 インターネットの広告を出すときに、広告登録フォームでURLがエラーになるから、ということでした。 広告登録フォームでURLがエラーにならなければ良いのかと思い、 xxx/aaa%5b%5d/1,2,3/bbb%5b%5d/1,2,3/ というように [ ] の部分をURLエンコードする方法をお伝えしましたが、%が付くのもダメということでした。 xxx/aaa_0/1/aaa_1/2/aaa_2/3/bbb_0/1/bbb_1/2/bbb_2/3/ というように カンマ区切りじゃなくなるのも嫌だそうです。 あくまで xxx/aaa/1,2,3/bbb/1,2,3/ の形が良いとのことでした。

  • phpでのメールフォームの作成について

    HTMLで <form action="mail.php" method="post"> <input name="aaa" type="checkbox" id="aaa" value="AAA" checked> <input name="bbb" type="checkbox" id="bbb" value="BBB" checked> <input name="ccc" type="checkbox" id="ccc" value="CCC" checked> </form> として、次に進むボタンを押すとmail.phpに飛び mail.phpでは、チェックされたものだけを表示したいのですが、どうすればよいでしょうか? もし、AAAとBBBが選ばれたら あなたが選んだのは AAA、BBBです。 と表示したいです。そのあとにメールフォームを続けるつもりです。 ご教授よろしくお願いします。

    • 締切済み
    • PHP
  • チェックボックスのvalueを連結してURLに追加

    <form method="get" action="<?php = $_SERVER['PHP_SELF']; ?>"> <input type="checkbox" name="c" value="001" /> <input type="checkbox" name="c" value="002" /> <input type="checkbox" name="c" value="003" /> <input type="checkbox" name="c" value="004" /> <input type="checkbox" name="c" value="005" /> <input type="submit" value="送信" /> </form> submitするとURLに ?c=001&c=002&c=003… が追加されます。 その形ではなく、c=001002003… と連結してURLに追加するにはどうしたら良いですか?

    • 締切済み
    • PHP
  • PHPバージョン4.3.10で動作しない

    はじめのページでチェックボックスにチェックしてもらい、 次のページでそのチェックしたものを表示したいです。 しかし、下記のコードではPHPバージョン4.3.10ではうまく動作しませんでした。 PHPバージョン4.3.10で動作させるには、どうすればよいか教えていただけませんか? <form action="mail.php" method="post"> <input name="member[]" type="checkbox" value="AAA" checked>AAA <input name="member[]" type="checkbox" value="BBB" checked>BBB <input name="member[]" type="checkbox" value="CCC" checked>CCC <input type="submit" value="send"> </form> mail.php <?PHP if(is_array($member)){ $txt ="あなたの選んだのは"; foreach ($member as $key=>$val){ if ($key==0){ $txt .=$val; }else{ $txt .="、".$val; } } $txt.="です"; }else{ $txt="あなたは誰も選んでません"; } print $txt; ?>

    • ベストアンサー
    • PHP
  • checkboxクリックされていないidを取得

    <form id="chkform"> <input type="checkbox" name="check" value="aaa" id="aaa">aaa <input type="checkbox" name="check" value="bbb" id="bbb">bbb <input type="checkbox" name="check" value="ccc" id="ccc">ccc                   ・                   ・                    ・ <input type="checkbox" name="check" value="zzz" id="zzz">zzz </form> チェックボックスの複数の項目の内、チェックされていない全てのIDを取得する方法を教えてください。 よろしくお願いいたします。

  • 一つのformで、複数のaction指定

    レイアウトなどの関係で、formの配置が基本とは異なるものになってしまい、うまく動作させる方法が見つからず困っています。 現在は <form> <input type="checkbox" name="select[]" value="●●"> <input type="checkbox" name="select[]" value="●●"> <input type="checkbox" name="select[]" value="●●"> </form> …… <form method="POST" action="A.php"> <input type="submit" name="aa" value="あああ"> </form> <form method="POST" action="B.php"> <input type="submit" name="bb" value="いいい"> </form> <form method="POST" action="C.php"> <input type="submit" name="cc" value="ううう"> </form> <form method="POST" action="D.php"> <input type="submit" name="dd" value="えええ"> </form> のようになっていて、チェックボックスの値を送信したいのは、Dのボタンを押したときだけPOSTされるようにしたい状態です。 この値を取得する方法か、もしくは <form method="POST" action="(ボタンに応じたもの)"> <input type="checkbox" name="select[]" value="●●"> <input type="checkbox" name="select[]" value="●●"> <input type="checkbox" name="select[]" value="●●"> …… <input type="submit" name="aa" value="あああ"> <input type="submit" name="bb" value="いいい"> <input type="submit" name="cc" value="ううう"> <input type="submit" name="dd" value="えええ"> </form> このように、一つのフォームの中に埋めてしまい、actionに入る値をボタンによって分ける方法はありませんでしょうか? もしくは他の方法でも構いません。 お分かりの方がいましたら、是非ご教授お願いいたします。

    • 締切済み
    • PHP
  • PHPでフォームからの送信

    PHPでフォームからデータを送信する方法について教えてください。例えばPHPファイルの中に下の様にフォームを作成して、送信ボタンを2つ作ります。一つのボタンをクリックすると全てのフォームの情報が送信されてしまいますが、独立して送信できるようにはできないのでしょうか。簡単にでもできるかできないかを教えていただけましたら、あとは自分でなんとかがんばりますので、どなたか教えていただけれますと幸いです。宜しくお願いします。 <form action="abc.php" method="post"> AAA:<input type="text" name="simei"> BBB:<input type="password" name="pass"> <input type="submit" value="送信"> </form> <form action="abc.php" method="post"> CCC:<input type="text" name="simei"> DDD:<input type="text" name="pass"> <input type="submit" value="送信"> </form>

    • ベストアンサー
    • PHP
  • submitではなくbuttonで送信

    事情があり、submitではなくbuttonでフォームのデータを送信したいのですが、以下のように書くとbuttonでは4567が送信されません。 <form action="test.cgi" method="post"> <INPUT type="hidden" name="aaa" value="1234"> <INPUT type="submit" name="bbb" value="4567"> </form> ↓ <form action="test.cgi" method="post"> <INPUT type="hidden" name="aaa" value="1234"> <INPUT type="button" name="bbb" value="4567" onclick="submit();" > </form> submitと同じように、bbbのデータ4567も送信するにはどのように書けばよいのでしょうか? 宜しくお願いします。

  • チェックボックスのデータの受け取り方について

    以下のようなチェックボックスを作ったとき、 test.phpではどうやって受け取ればよいのでしょうか? nameがそれぞれ違う場合は分かるのですが... 教えてください。 <form method="POST" action="test.php"> <input type="checkbox" name="color" value="red">赤</input> <input type="checkbox" name="color" value="blue">青</input> <input type="checkbox" name="color" value="white">白</input> <input type="checkbox" name="color" value="black">黒</input> <input type="submit" value="送信" > </form>

    • ベストアンサー
    • PHP
  • PHPでURLにジャンプするには?

    フォームで指定したURLにPHPでジャンプするコードは、以下しかないのでしょうか? url_form.html---------------------------- <form action="url_jump.php" method="GET"> <input type="text" name="url"> <input type="submit" value="送信"> </form> ----------------------------------------- url_jump.php----------------------------- $url_path = $_GET(["url"]); @readfile($url_path); ----------------------------------------- 上記方法だと画像は読みこみません。もっと簡単にURLにジャンプできますか?

    • ベストアンサー
    • PHP