Aliasmatch REGEX MOD_ALIAS - Combinando tudo em uma pasta, exceto dois padrões?
Pergunta
Eu gostaria de usar aliasmatch para criar um pseudônimo para tudo em uma pasta, exceto Para dois (ou mais) padrões REGEX específicos.
Por exemplo, o Aliasmatch a seguir cria um alias para tudo na pasta 'Conteúdo':
AliasMatch /content(.*) /home/username/public_html/$1
Mas existem dois padrões regex que eu não quero que o alias acima corresponda, por exemplo:
^content/([a-zA-Z0-9_-]+)/id-([a-zA-Z0-9_-]+)/([0-9]+)
^content/([a-zA-Z0-9_-]+)/nn-([a-zA-Z0-9_-]+)
Eu sei que o caractere não (!) Pode ser usado para negar um padrão, mas não sei como usá -lo aqui ou como negar vários padrões em aliasmatch.
Como isso poderia ser feito?
Solução
O que você está falando é chamado Lookahead negativo, e você apenas envolve o regex para o que não quer combinar, assim: (?!foo)
. A combinação de regexes pode ser tão simples quanto amarrá -los com um tubo entre eles, mas você pode fazer um pouco melhor do que isso neste caso. Isso reutiliza a primeira parte dos dois regexes, o que é idêntico:
[a-zA-Z0-9_-]+/(?:id-[a-zA-Z0-9_-]+/[0-9]+|nn-[a-zA-Z0-9_-]+)
Porque o tubo (ou '|'
, o operador de alternância) tem menor precedência do que qualquer outra coisa, a alternância deve ser contida em um grupo. Observe que eu usei um Grupo não capturado - ou seja, (?:...)
- e se livrou dos parênteses em seus regexes. Caso contrário, eles teriam jogado fora da numeração de um grupo que você Faz quero capturar, e você teria que usar algo diferente $1
na segunda parte da regra. Aqui está todo o regex:
^/content(?![a-zA-Z0-9_-]+/(?:id-[a-zA-Z0-9_-]+/[0-9]+|nn-[a-zA-Z0-9_-]+))(.*)
EDIT: Aparentemente, o sabor Regex usado pelo Aliasmatch não suporta LookaHeads, mas tem sua própria sintaxe de negação: !(^/foo)
. Seu objetivo parece ser negar todo o regex, o que significa que não o ajudaria, mas talvez você não precise. Talvez você possa apenas alias, esses diretórios para si mesmos. Então você não teria que negar nada.
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 talvez você possa fazer algo com um <DirectoryMatch>
Diretiva, ou mudando para mod_rewrite. Mas (obviamente) não sou um especialista em Apache-minha especialidade é regexes, e não acho que um regex resolva seu problema.
Outras dicas
Modalias de fato suporta lookaheads negativos. Estou usando isso no meu site, o que funciona muito bem:
AliasMatch ^/(?!w/|BingSiteAuth\.xml$|favicon\.ico$|google.{16}\.html$|robots\.txt$) /path/to/file
Certifique -se de começar seu regex com um "/", pois é sempre o primeiro personagem com mod_alias! Nunca tente iniciar sua regra com uma aparência, ou então a análise falhará.