mod_alias AliasMatch Regex – alles in einem Ordner außer zwei Mustern abgleichen?

StackOverflow https://stackoverflow.com/questions/1352920

  •  20-09-2019
  •  | 
  •  

Frage

Ich möchte AliasMatch verwenden, um einen Alias ​​für alles in einem Ordner zu erstellen. außer für zwei (oder mehr) spezifische Regex-Muster.

Der folgende AliasMatch erstellt beispielsweise einen Alias ​​für alles im Ordner „content“:

AliasMatch /content(.*) /home/username/public_html/$1

Es gibt jedoch zwei Regex-Muster, mit denen der obige Alias ​​nicht übereinstimmen soll, zum Beispiel:

^content/([a-zA-Z0-9_-]+)/id-([a-zA-Z0-9_-]+)/([0-9]+)
^content/([a-zA-Z0-9_-]+)/nn-([a-zA-Z0-9_-]+)

Ich weiß, dass das Zeichen NOT (!) zum Negieren eines Musters verwendet werden kann, aber ich weiß nicht, wie ich es hier verwenden soll oder wie ich mehrere Muster in AliasMatch negieren soll.

Wie könnte das geschehen?

War es hilfreich?

Lösung

Was Sie meinen, heißt negativer Ausblick, und Sie wickeln es einfach um den regulären Ausdruck für das, was nicht übereinstimmen soll, wie folgt: (?!foo).Das Kombinieren von regulären Ausdrücken kann so einfach sein, dass man sie mit einer Pipe dazwischen aneinanderreiht, aber in diesem Fall geht es noch etwas besser.Dieser reguläre Ausdruck verwendet den ersten Teil der beiden regulären Ausdrücke wieder, der identisch ist:

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

Weil das Rohr (bzw '|', der Wechseloperator) eine niedrigere Priorität als alles andere hat, muss der Wechsel in einer Gruppe enthalten sein.Beachten Sie, dass ich a verwendet habe nicht erfassende Gruppe -- d.h., (?:...) – und die Klammern in Ihren regulären Ausdrücken entfernt.Sonst hätten sie die Nummerierung der einen Gruppe verfälscht Tun erfassen möchten, und Sie hätten etwas anderes verwenden müssen als $1 im zweiten Teil der Regel.Hier ist der gesamte reguläre Ausdruck:

^/content(?![a-zA-Z0-9_-]+/(?:id-[a-zA-Z0-9_-]+/[0-9]+|nn-[a-zA-Z0-9_-]+))(.*)

BEARBEITEN:Anscheinend unterstützt die von AliasMatch verwendete Regex-Variante keine Lookaheads, verfügt aber über eine eigene Negationssyntax: !(^/foo).Sein Zweck scheint darin zu bestehen, den gesamten regulären Ausdruck zu negieren, was bedeutet, dass es Ihnen nicht helfen würde, aber vielleicht brauchen Sie es nicht.Vielleicht können Sie diese Verzeichnisse einfach mit einem Alias ​​versehen.Dann müssten Sie nichts negieren.

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

Oder vielleicht können Sie etwas mit einem machen <DirectoryMatch> Direktive oder durch Wechseln zu mod_rewrite.Aber ich bin (offensichtlich) kein Apache-Experte – meine Spezialität sind reguläre Ausdrücke, und ich glaube nicht, dass ein regulärer Ausdruck Ihr Problem lösen wird.

Andere Tipps

ModAlias ​​unterstützt tatsächlich negative Lookaheads.Ich verwende Folgendes auf meiner Website, was sehr gut funktioniert:

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

Stellen Sie sicher, dass Ihr regulärer Ausdruck mit einem „/“ beginnt, da es immer das erste Zeichen mit mod_alias ist!Versuchen Sie niemals, Ihre Regel mit einem Lookahead zu beginnen, da sonst die Analyse fehlschlägt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top