2

AliasMatch を使用して、2 つ (またはそれ以上) の特定の正規表現パターンを除いて、フォルダー内のすべてのエイリアスを作成したいと考えています。

たとえば、次の AliasMatch は、'content' フォルダー内のすべてのエイリアスを作成します。

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 で複数のパターンを否定する方法がわかりません。

これはどのように行うことができますか?

4

2 に答える 2

5

実際、ModAlias は否定先読みをサポートしています。私は自分のサイトでこれを使用していますが、これは非常にうまく機能します:

AliasMatch ^/(?!w/|BingSiteAuth\.xml$|favicon\.ico$|google.{16}\.html$|robots\.txt$) /path/to/file

mod_alias の最初の文字は常に "/" であるため、必ず正規表現を "/" で開始してください! 先読みでルールを開始しようとしないでください。そうしないと、解析が失敗します。

于 2012-10-01T22:11:48.033 に答える
2

あなたが話していることは否定的先読みと呼ばれ、次のように、一致させたくないものの正規表現をラップするだけです(?!foo)。正規表現を結合することは、それらをパイプでつなぎ合わせるのと同じくらい簡単ですが、この場合はそれよりも少し良いことができます。この正規表現は、同一の 2 つの正規表現の最初の部分を再利用します。

[a-zA-Z0-9_-]+/(?:id-[a-zA-Z0-9_-]+/[0-9]+|nn-[a-zA-Z0-9_-]+)

パイプ (または'|'、代替演算子) は他の何よりも優先順位が低いため、代替はグループに含める必要があります。非キャプチャ グループ(つまり、)を使用(?:...)し、正規表現の括弧を削除したことに注意してください。そうしないと、キャプチャしたい 1 つのグループの番号付けが無効になり$1、ルールの 2 番目の部分以外のものを使用する必要があったでしょう。正規表現全体は次のとおりです。

^/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 の専門家ではありません。私の専門は正規表現であり、正規表現があなたの問題を解決するとは思いません。

于 2009-08-30T03:11:43.380 に答える