mod_alias AliasMatch Regex qui correspond à tout le dans un dossier, à l'exception de deux modèles?

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

  •  20-09-2019
  •  | 
  •  

Question

Je voudrais utiliser AliasMatch pour créer un alias pour le tout dans un dossier, sauf pour les deux (ou plus) des modèles regex.

Par exemple, le AliasMatch suivante crée un alias pour tout le contenu d'un dossier:

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

Mais il y a deux modèles regex que je ne veux pas être au-dessus de l'Alias pour correspondre, par exemple:

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

Je sais que le PAS (!) caractère qui peut être utilisé pour annuler un modèle, mais je ne sais pas comment l'utiliser ici, ou comment nier plusieurs modèles dans AliasMatch.

Comment cela pourrait-il être fait?

Était-ce utile?

La solution

Ce dont vous parlez s'appelle anticipation négatif, et vous venez de les enrouler autour de la regex pour ce que vous ne voulez pas de match, comme ceci: (?!foo).Combinant les regexes peut être aussi simple que de les enchaîner avec un tuyau d'entre eux, mais vous pouvez faire un peu mieux que dans ce cas.Cette regex réutilise la première partie des deux regexes, qui est identique:

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

Parce que le tube (ou '|', l'alternance de l'opérateur) a priorité plus basse que toute autre chose, l'alternance doit être contenue dans un groupe.Remarquez que j'ai utilisé un non-capture d'un groupe -- c'est à dire, (?:...) -- et se débarrasser de l'parenthèses dans votre regexes.Sinon, ils auraient jeté hors de la numérotation de la un groupe, vous faire pour la capture, et vous auriez eu à utiliser autre chose que $1 dans la deuxième partie de la règle.Voici l'ensemble de la regex:

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

EDIT:Apparemment, la regex saveur utilisé par AliasMatch ne prend pas en charge lookaheads, mais il a sa propre négation de la syntaxe: !(^/foo).Son but semble être de nier l'ensemble de la regex, ce qui signifie qu'il ne serait pas vous aider, mais peut-être que vous n'en avez pas besoin.Peut-être vous pouvez simplement alias de ces répertoires à eux-mêmes.Ensuite, vous n'auriez pas de nier quoi que ce soit.

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

Ou peut-être vous pouvez faire quelque chose avec un <DirectoryMatch> la directive, ou par commutation de mod_rewrite.Mais je suis (évidemment) pas un Apache expert--ma spécialité est regexes, et je ne pense pas qu'une regex va résoudre votre problème.

Autres conseils

ModAlias, dans les faits, le soutien négatif lookaheads.Je suis en utilisant ce sur mon site, qui fonctionne très bien:

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

Assurez-vous d'avoir votre regex commencer par un "/", comme c'est toujours le premier personnage avec mod_alias!N'essayez jamais de démarrer votre règle avec l'anticipation, ou encore l'analyse échoue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top