2017-01-18 9 views
1

私はRegexp、RewriteCondおよびRewriteRuleに慣れています。Apache RewriteRuleが置換されないRewriteCondキャプチャグループがネゲートされたパターン

問題は、私のRewriteRuleが最後のRewriteCondのキャプチャグループを置換しないということです。

のApache v2.4.10

RewriteCond %{REQUEST_URI} !(apps/)?index.php 
RewriteRule ^(apps/)?(.*)$ /%1index.php?$2 [QSA,NC,L] 

ドキュメントによると、%1はのRewriteCondでキャプチャグループに置き換えてください:(apps/)そうではありません。

Apacheのデバッグ:

RewriteCond: input='/apps/x/y' pattern='!(apps/)?index.php' => matched 
rewrite 'x/y' -> '/index.php?x/y' 

デバッグ実際にはCondのが一致していることを述べているので、それがグループをキャプチャする必要があります。

入力にはapps/部分が含まれています。

しかし、その後、リライトはそれを考慮していない...

試合を強制するために、次のように余分な(役に立たない)のRewriteCondを追加するが、はそれを動作させるん!とパターンを否定せず、そう確かにキャプチャグループがキャプチャされ、置換されます。

RewriteCond %{REQUEST_URI} !(apps/)?index.php 
RewriteCond %{REQUEST_URI} ^/(apps/)? 
RewriteRule ^(apps/)?(.*)$ /%1index.php?$2 [QSA,NC,L] 

考えてください。これは、キャプチャグループを評価しないような!の正規表現からの最適化ですか?これはバグとして報告されるべきですか?それはどこに文書化されていますか?定義によってパターンと一致しませんでしたので、をキャプチャするは何もありませんので

答えて

1

は何も否定パターンでキャプチャされません。それはドキュメントに記載されていますが、あなたがそれについて考えるならば明らかです。そこになかったものはどうして捕らえられますか?キャプチャは正規表現の内容からではなく、マッチから得られます。ワイルドカードやその他の可変パターンを含めることができます。あなたの場合はそうではありません。もしそうなら、キャプチャには何が置かれますか?使用するものは何もありません。それがなければ、あなたはすでにそれが何であるかをすでに知っているので、それを「捕らえる」必要はありません。否定パターンでキャプチャする場所はありません。ドキュメントから

パターンを否定しないで文字を使用して、あなたがそのパターンでグループ化されたワイルドカード部分を含めることはできません。これは、パターンが一致しない場合(つまり、否定が一致する場合)、グループの内容が存在しないためです。したがって、ネゲートされたパターンを使用すると、置換文字列に$ Nを使用することはできません!

上記は、RewriteRuleのセクションですが、ネゲートされたRewriteCondパターンの場合も同様です。

+0

ドキュメント参照のおかげで、私は明らかにその部分を逃した – Simon

関連する問題