3

index.phpさまざまなGETパラメーターを使用して、すべてのリクエストをリダイレクトするプロジェクトがあります。

現在、私はこの種の htaccess を使用しています (これは単なる抜粋でありa, b, c...、問​​題を単純化するためにパラメーター名を に変更しました)。

RewriteRule ^([\w-]+)\.html$                   index.php?a=$1 [L]
RewriteRule ^([\w-]+)/([\w-]+)\.html$          index.php?a=$1&b=$2 [L]
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)\.html$ index.php?a=$1&b=$2&c=$3 [L]
(...)

それはうまくいきますが、私はそれらの行を単一の行に縮小する方法を考えていました。 アイデアは、すべてのパラメーターを「生成」するためにいくつかのネストされた括弧を持つGETことですが、思ったほど簡単には機能しないようです。

これが私がこれまでに作ったものです:

RewriteRule 
    ^(?:([\w-]+)\/)*([\w-]+)\.html$ 
    index.php?a=$1&b=$2&c=$3&d=$4&e=$5&f=$6&g=$7&h=$8&i=$9 [L]

GETURL の結果http://website.com/1/2/3/4/5/6/7/8/9.html:

array(9) { 
   ["a"]=> string(1) "8" 
   ["b"]=> string(1) "9" 
   ["c"]=> string(0) "" 
   ["d"]=> string(0) "" 
   ["e"]=> string(0) "" 
   ["f"]=> string(0) "" 
   ["g"]=> string(0) "" 
   ["h"]=> string(0) "" 
   ["i"]=> string(0) "" 
}

a=1get , b=2, c=3...の代わりに、最後の 2 つのパラメーターのみを受け取ります。が実行されることに注意してくださいRewriteRule。正規表現の一致がわかります。

何か案が ?

4

2 に答える 2

3

念のため: PHP ベースのアプローチを使用することを検討してください: 要求された URI 全体を PHP に渡すと、PHP ですべてを処理できます。 mod_rewrite による魔法。

私は次のようなことを意味します:

 RewriteRule ^(.*)\.html$ switchboard.php?uri=$1 [L]

次にswitchboard.phpで:

list($_GET['a'], $_GET['b'], $_GET['c']) = explode( '/', $_GET['uri']);
require 'index.php';

(非常に長い list() が面倒に見える場合は、巧妙なワンライナー マッピング手法を使用できます)

とにかく、正規表現の質問は確かに興味深いものですが、それは一般的な PCRE のものです。この現象は「繰り返しキャプチャ グループ」と呼ばれます: クリーネ スターを使用してキャプチャ グループを繰り返すと、最後の反復のみが実際にキャプチャされます (この場合、マッチ 1,2..7 は破棄され、 8 だけが保持されていました) - より新しい一致で上書きし続けるバッファとして想像してください。あなたがそれについて考えるなら、それは非常に理にかなっています。

解決策は、以前のグループをオプションにすることにより、実際にキャプチャしたいだけのグループを使用することです-読み書きするのは信じられないほど厄介です(実際、Arjanは投稿したばかりで、見るだけで頭痛の種です)。この場合、非常に非効率的です。はるかに簡単な解決策は、全体をキャプチャして分割することです。

于 2012-08-24T14:20:46.843 に答える
1
RewriteRule 
    ^([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+))?)?)?)?)?)?)?)?\.html$ 
    index.php?a=$1&b=$2&c=$3&d=$4&e=$5&f=$6&g=$7&h=$8&i=$9 [L]

テストされていませんが、これはあなたが望むことだと思います。1 ~ 9 個のパラメーターで機能することに注意してください。少なくとも 1 つ必要です。また、元の URL に存在していた GET パラメータは、この方法で削除できることに注意してください。

于 2012-08-24T14:21:08.963 に答える