あなたが話していることは否定的先読みと呼ばれ、次のように、一致させたくないものの正規表現をラップするだけです(?!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 の専門家ではありません。私の専門は正規表現であり、正規表現があなたの問題を解決するとは思いません。