0

.htaccessを含むファイルを介していくつかの URL をブロックしようとしていますRedirectMatch 403

を含むものはすべて、URL に含まれていないYES場合にのみ一致する必要があります。NOURL が一致するかどうかの例:

  • /dir/ YES/ -> はい
  • / YES/file.ext -> はい
  • /dir/ NO/dir/ YES/file.ext -> いいえ
  • / NO/dir/dir/ YES/file.ext -> いいえ

dirまた、 と の間に不明な数が/YESあり/NOます。

次のようなさまざまな後読みとパターンを試しました。

  • (?<!themes/)(vendor)
  • (?<=[^themes])(/vendor)
  • (?<![themes/])(/|/[^themes]+/)vendor(/|$)

しかし、何かを機能させるのに苦労しており、これが実際に良い考えかどうか疑問に思っています。

4

2 に答える 2

2

次のような特定の RewriteCond で使用します。

RewriteCond %{REQUEST_URI} !/NO/ [NC]
RewriteRule (^|/)YES(/.*|)$ - [F,L,NC]
于 2013-04-19T18:50:41.153 に答える
1

パターンが機能しない理由:

(?<!themes/)(vendor)

themes/が のすぐ左にある場合にのみ一致を破棄しvendorます。後読みは、文字列全体を自動的にトラバースしません。

(?<=[^themes])(/vendor)

文字クラスはこのようには機能しません。、、、またはのいずれ[^themes]でもない単一の文字に一致します。ehmst

あなたが望むのは(?<!themes.*/)(vendor)、任意の長さの後読みを許可するのは.NETだけです。

秘訣は、最初から始めて、先読みNOを使用する途中に何もないことを確認することです。YES

^(?!.*NO).*(YES)

また

^(?!.*themes).*(vendor)

先読みは可変長になる可能性があるためです。が の後NOに表示される場合は、 に向かう途中のすべての文字をチェックする必要があります。 YESYES

^((?!NO).)*(YES)
^((?!themes).)*(vendor)

編集: anubhavaのソリューションは、実際にははるかにきれいです。単一の正規表現ソリューションが必要な場合は、私のものを参照として使用できます。

于 2013-04-19T18:52:45.167 に答える