RewriteRuleが効いているURLで、?以降の文字列を取得する方法
mod_rewriteを使って、「/foo/bar/(.*)/」みたいなURLを、「/foo.php?id=なんちゃら」みたいなURLに変換させている場合に、意外と厄介なのが、?以降の文字列(QUERY_STRING)が、$_GET[“なんちゃら”]みたいな形式で、正常に取得できないことです。
要するに、こんな感じですね。
.htaccess:
RewriteRule ^foo/bar/(.*)/ /foo.php?id=$1 [L]
この場合、
/foo/bar/123/
のようにアクセスすると、
foo.phpでは、「$_GET[“id"]」で、
123の値を取得する事ができます。
しかしながら、
/foo/bar/123/?bar=555
とした場合、「$_GET[“bar"]」には、
値は何も入っていないのです。
んで、ここからが本題。
$_SERVER[“REQUEST_URI"]には、きちんと、
「/foo/bar/123/?bar=555」として、
?以降の文字列が存在しているので、
explode関数を使って、「?」で切って、「=」で切れば良いだけの話です。
関数に書くと、こんな感じで済みます。
// parse_query_strings()を実行すると、?以降の文字列を解釈して、$_GETに代入します。
function parse_query_strings(){
if(strpos($_SERVER["REQUEST_URI"], "?") !== FALSE){
list($dummy, $tmp) = explode("?", $_SERVER["REQUEST_URI"]);
$data = explode("&", $tmp);
foreach($data as $value){
list($k, $v) = explode("=", $value);
if(empty($_GET[$k])){
$_GET[$k] = $v;
}
}
}
}
function parse_query_strings(){
if(strpos($_SERVER["REQUEST_URI"], "?") !== FALSE){
list($dummy, $tmp) = explode("?", $_SERVER["REQUEST_URI"]);
$data = explode("&", $tmp);
foreach($data as $value){
list($k, $v) = explode("=", $value);
if(empty($_GET[$k])){
$_GET[$k] = $v;
}
}
}
}
これで、$_GET変数に、値が代入されました。
めでたしめでたし♪
この記事の最終更新日:2018/06/04
最初に記事を書いた日:2018/06/04
この記事をシェアする
関連記事
- ・外部メールサーバーからメール送信するPHPの関数(簡略版)
- ・TinyMCEにelFinderを搭載した環境で、ファイルを選択できるようにする方法
- ・秒速でPHPのフォームにreCAPTCHA v3を導入するサンプルコード
- ・htaccessのRewriteでGETパラメータを無理やり引き継ぐPHPコード
- ・ワードプレスでコメントを完全無効にする方法【コメントスパム対策】
- ・MacでPHP環境のローカルサーバーを立ち上げる方法
- ・画像ファイルをリサイズして、データで返す
リサイズした結果を、ファイルではなく変数に返す。 - ・サーバー内の全てのファイルから、文字列検索
HTTPS化作業に使える - ・PHPで、指定したディレクトリ以下のファイル一覧を再帰的に取得
- ・Googleストリートビューで建物内部が表示されないようにする
Google Maps API v3