mod_alias AliasMatch Regex - matching tutto in una cartella, ad eccezione di due modelli?

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

  •  20-09-2019
  •  | 
  •  

Domanda

Vorrei utilizzare AliasMatch per creare un alias per il tutto all'interno di una cartella, salvo per due (o più) specifici regex modelli.

Per esempio, i seguenti AliasMatch crea un alias per tutto il contenuto della cartella:

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

Ma ci sono due regex motivi che non voglio che il sopra Alias per corrispondenza, per esempio:

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

So che NON (!) può essere usato per negare un modello, ma non so come usarlo, o come negare più modelli in AliasMatch.

Come potrebbe essere fatto?

È stato utile?

Soluzione

Di cosa stai parlando si chiama lookahead negativo, e basta avvolgerlo intorno alla regex per ciò che non desidera partita, come questo: (?!foo).Combinando le espressioni regolari possono essere semplici, come li stringa insieme con un tubo tra di loro, ma si può fare un po ' meglio in questo caso.Questa regex riutilizza la prima parte delle due espressioni regolari, che è identico:

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

Perché il tubo (o '|', l'alternanza operatore) ha la precedenza inferiore di ogni altra cosa, l'alternanza deve essere contenuto in un gruppo.Notare che ho usato un non-acquisizione di gruppo - cioè, (?:...) -- e si sono sbarazzati delle parentesi nelle espressioni regolari.In caso contrario, avrebbero buttato fuori la numerazione di un gruppo che si fare desidera catturare, e che avrebbe dovuto usare qualcosa di diverso $1 nella seconda parte della regola.Ecco tutta la regex:

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

EDIT:A quanto pare, la regex sapore utilizzato da AliasMatch non supporta lookaheads, ma ha la sua propria negazione sintassi: !(^/foo).Il suo scopo sembra essere quello di negare tutta la regex, il che significa non aiutare, ma forse tu non ne hai bisogno.Forse si può solo alias quelle directory di se stessi.Quindi non c'è da negare nulla.

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

O forse si può fare qualcosa con un <DirectoryMatch> la direttiva, passando per il mod_rewrite.Ma io sono (ovviamente) non è un Apache esperto--la mia specialità sono le espressioni regolari, e non penso che una regex risolveranno il tuo problema.

Altri suggerimenti

ModAlias, infatti, il supporto negativi lookaheads.Sto usando questo sul mio sito, che funziona molto bene:

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

Essere sicuri di avere il vostro regex inizia con "/", in quanto è sempre il primo carattere con mod_alias!Non tentare mai di iniziare la vostra regola con lookahead, o altro analisi avrà esito negativo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top