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


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

回答の条件
  • 1人2回まで
  • 登録:2007/11/29 13:53:26
  • 終了:2007/12/06 13:55:04

回答(2件)

id:y-kawaz No.1

y-kawaz回答回数1420ベストアンサー獲得回数2252007/11/29 14:30:11

ポイント35pt

可変とはいえ恐らく有限個と思われるので、一番単純なのは以下のように必要な数だけ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 等にセットし直して使う方法です。


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

id:zap50326

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

2007/12/04 17:39:12
id:tezcello No.2

tezcello回答回数460ベストアンサー獲得回数692007/11/29 15:26:26

ポイント35pt

パラメータ数が不定では簡単には書けませんが、渡す先は一つなので、最初の回答者さんのように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" }

となります。

id:zap50326

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

2007/12/04 17:46:49

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません