2

私のルールの中で私が持っている..

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?page=$1&submenu=$2&info=$3&id=$4 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?page=$1&submenu=$2&info=$3 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ index.php?page=$1&submenu=$2 [QSA,L] 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/?$  index.php?page=$1 [QSA,L]

これは私には少しかさばるように見え、多くのことを繰り返します。それを短縮する方法についてのアイデアはありますか?

「グローバル」条件を設定できますか? その下のすべてのものをキャプチャするこのようなルールを1つ持つことはできますか(空の変数を介して送信するかどうかは気にしません)

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule **clever stuff here** index.php?page=$1&submenu=$2&info=$3&id=$4 [QSA,L]

だからそれはキャプチャします

domain.com/a/b/c/d および domain.com/a/b/c および domain.com/a/b および domain.com/a

答え、考え、熟考、実存的な議論はすべて高く評価されています...

4

1 に答える 1

0

逆をチェックして書き換えエンジンを通過させると、条件を非常に簡単に削除できます。その後既存のファイルまたはディレクトリではないことがわかります。

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?page=$1&submenu=$2&info=$3&id=$4 [QSA,L]
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ index.php?page=$1&submenu=$2&info=$3 [QSA,L]
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ index.php?page=$1&submenu=$2 [QSA,L] 
RewriteRule ^([^/\.]+)/?$  index.php?page=$1 [QSA,L]

これは、すべてを 1 行で実行するような派手な複数先読み正規表現ではありませんが、読みやすくなります。

編集:

さて、私が言ったように、次のような複数の先読みでそれを行います。

RewriteRule ^(?:([^/.]+)|)(?:/([^/.]+)|)(?:/([^/.]+)|)(?:/([^/.]+)|) index.php?page=$1&submenu=$2&info=$3&id=$4 [QSA,L]

しかし、読みにくく、何かを変更すると予期しないことが起こる可能性が高くなります。さらに、明示的な 4 つの異なるマッピングがある一方で、先読みの場合のように空白のクエリ文字列パラメーターを取得することはありません。最後(?:/([^/.]+)|)が存在するかどうかに関係なく、idパラメーターは取得されます (空白のみ)。

于 2013-04-25T09:50:48.853 に答える