人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

mod_rewrite で、/test1/01/01/01/ を /test1/index.php?id1=1&id2=1&id3=1 としたい。 (その際、パラメータの個数が不定) 場合、どのように記述したらよいでしょうか?

"QSA"をつかうのでしょうか?


●質問者: zap50326
●カテゴリ:インターネット ウェブ制作
✍キーワード:INDEX mod_rewrite PHP パラメータ 記述
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● y-kawaz
●35ポイント

可変とはいえ恐らく有限個と思われるので、一番単純なのは以下のように必要な数だけRewriteRuleを並べておくことでしょうかね。(例はid10までとりあえず書いてみました)

RewriteRule ^/test1/([^/\?]*)/(\?.*)?$ /test1/index.php?id1=$1 [QSA]
RewriteRule ^/test1/([^/\?]*)/([^/\?]*)/(\?.*)?$ /test1/index.php?id1=$1&id2=$2 [QSA]
RewriteRule ^/test1/([^/\?]*)/([^/\?]*)/([^/\?]*)/(\?.*)?$ /test1/index.php?id1=$1&id2=$2&id3=$3 [QSA]
RewriteRule ^/test1/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/(\?.*)?$ /test1/index.php?id1=$1&id2=$2&id3=$3&id4=$4 [QSA]
RewriteRule ^/test1/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/(\?.*)?$ /test1/index.php?id1=$1&id2=$2&id3=$3&id4=$4&id5=$5 [QSA]
RewriteRule ^/test1/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/(\?.*)?$ /test1/index.php?id1=$1&id2=$2&id3=$3&id4=$4&id5=$5&id6=$6 [QSA]
RewriteRule ^/test1/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/(\?.*)?$ /test1/index.php?id1=$&id2=$2&id3=$3&id4=$4&id5=$5&id6=$6&id7=$7 [QSA]
RewriteRule ^/test1/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/(\?.*)?$ /test1/index.php?id1=$1&id2=$2&id3=$3&id4=$4&id5=$5&id6=$6&id7=$7&id8=$8 [QSA]
RewriteRule ^/test1/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/(\?.*)?$ /test1/index.php?id1=$1&id2=$2&id3=$3&id4=$4&id5=$5&id6=$6&id7=$7&id8=$8&id9=$9 [QSA]
RewriteRule ^/test1/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/([^/\?]*)/(\?.*)?$ /test1/index.php?id1=$1&id2=$2&id3=$3&id4=$4&id5=$5&id6=$6&id7=$7&id8=$8&id9=$9&id10=$10 [QSA]

もし /test1/01/01/01/?foo=bar のようにパスパラメータ(?)以外にクエリが付いている場合も考慮して QSA を付けてあります。

なので上記設定だと、/test1/01/01/01/?foo=bar は /test1/index.php?id1=01&id2=01&id3=01&foo=bar とrewriteされます。


また、パッと思いつくだけで他に2つほど方法が考えられます。

・一つは RewriteMap でプログラムパイプを使う方法です。

これを使いこなすのは結構難しいですが上手く使えば外部プログラムで自由にパスの変換ルールを作ることが出来ます。

実際の使い方は説明は省かせて貰います RewriteMap をキーワードで調べてみて下さい。

・もう一つはphp側の修正も必要になる案ですが、

まず、/test1/01/01/01/ を /test1/index.php/01/01/01/ に rewrite するルールを書きます。

すると php からは $_SERVER["PATH_INFO"] で '/01/01/01/' という値が取得できるのでこれをパースして $id1 等にセットし直して使う方法です。


参考になりましたでしょうか?

◎質問者からの返答

ありがとうございます。10個もあると壮絶ですね。


2 ● tezcello
●35ポイント

パラメータ数が不定では簡単には書けませんが、渡す先は一つなので、最初の回答者さんのようにPHP側で処理する方が良いでしょう。

RewriteRule ^test1/(.+)/?$ index.php?para=$1 [L,QSA]

としてやれば、

test1/01/02/05/04/?hoge=123

のアクセスは、index.php に rewrite されて、$_GET の内容は

array(2) { ["para"]=> string(12) "01/02/05/04/" ["hoge"]=> string(3) "123" }

となります。

◎質問者からの返答

ありがとうございます。やはり可変というのはむずかしいのですね。PHP使います。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ