mod_alias AliasMatch正規表現 - 二つのパターン以外のフォルダ内のすべてを一致?
質問
私ははの2つ(またはそれ以上)は、特定の正規表現パターンを除いて、フォルダ内のすべてのエイリアスを作成するためにAliasMatchを使用するようにしたいと思います。
たとえば、次のAliasMatchは、「コンテンツ」フォルダ内のすべてのエイリアスを作成します
AliasMatch /content(.*) /home/username/public_html/$1
しかし、私は上記の別名が一致したくない2つの正規表現のパターンが存在する例えばます:
^content/([a-zA-Z0-9_-]+)/id-([a-zA-Z0-9_-]+)/([0-9]+)
^content/([a-zA-Z0-9_-]+)/nn-([a-zA-Z0-9_-]+)
私が知っているNOT(!)の文字はパターンを否定するために使用することができますが、私はAliasMatchに複数のパターンを否定するためにここでそれを使用するか、どのようにする方法がわからない。
どのようにこれが行われるだろうか?
解決
は、の否定先読みのと呼ばれている話をしている、とあなたはちょうどあなたがこのように、一致したくないもののために正規表現のまわりでそれを包むもの:(?!foo)
。正規表現を組み合わせることで、それらの間のパイプと一緒にそれらの文字列のような単純なことができますが、この場合にはそれよりも少し良く行うことができます。この正規表現は、同じ2つの正規表現の最初の部分を、再利用
[a-zA-Z0-9_-]+/(?:id-[a-zA-Z0-9_-]+/[0-9]+|nn-[a-zA-Z0-9_-]+)
パイプ(又は'|'
、交替オペレータ)が何よりも低い優先順位を有するので、、交互グループに含まれなければなりません。すなわち、(?:...)
- - とあなたの正規表現で括弧を処分した私は、の非キャプチャグループのを使用していることに注意してください。そうでなければ、彼らはあなたがの行うがキャプチャしたいを一つのグループの番号をオフに投げているだろう、とあなたは、ルールの第二部で$1
以外のものを使用しなければならなかったでしょう。ここでは全体の正規表現があります:
^/content(?![a-zA-Z0-9_-]+/(?:id-[a-zA-Z0-9_-]+/[0-9]+|nn-[a-zA-Z0-9_-]+))(.*)
編集:どうやら、AliasMatchで使用される正規表現の風味が先読みをサポートしていますが、独自の否定構文持っていません:!(^/foo)
を。その目的は、それはあなたを助けないだろうが、多分あなたはそれを必要としないことを意味し、全体の正規表現を、否定するように思われます。たぶん、あなたはただ自分自身にこれらのディレクトリのエイリアスを作成することができます。そして、あなたは何を否定する必要はありません。
AliasMatch ^(/content/[a-zA-Z0-9_-]+/id-[a-zA-Z0-9_-]+/[0-9]+.*) $1
AliasMatch ^(/content/[a-zA-Z0-9_-]+/nn-[a-zA-Z0-9_-]+.*) $1
AliasMatch ^/content/(.*) /home/username/public_html/$1
それとも、<DirectoryMatch>
ディレクティブで、またはmod_rewriteのに切り替えることで何かを行うことができます。しかし、私は(明らかに)Apacheの専門家ではない - 私の専門は正規表現であり、私は正規表現はあなたの問題を解決するために起こっているとは思いません。
他のヒント
MODALIASは、実際のサポート負の先読みではありません。私は非常にうまく機能し、私のサイト上で、これを使用しています:
AliasMatch ^/(?!w/|BingSiteAuth\.xml$|favicon\.ico$|google.{16}\.html$|robots\.txt$) /path/to/file
それは常にmod_aliasとの最初の文字であるように、、あなたの正規表現は「/」で始まる持っていることを確認してください!先読みを使用して、ルールを起動しようとしない、または他の解析が失敗します決してます。