Pregunta

Me gustaría utilizar AliasMatch para crear un alias para todo dentro de una carpeta, excepto de dos (o más) patrones de expresiones regulares específicas.

Por ejemplo, la siguiente AliasMatch crea un alias para todo en la carpeta 'contenido':

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

Pero hay dos patrones de expresiones regulares que no desea que el alias de arriba para que coincida, por ejemplo:

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

Yo sé que el NO (!) Personaje puede ser utilizado para negar un patrón, pero no sé cómo usarlo aquí, o cómo negar múltiples patrones en AliasMatch.

¿Cómo puede hacerse esto?

¿Fue útil?

Solución

Lo que estamos hablando se llama búsqueda negativa hacia delante , y sólo se envuelve alrededor de la expresión regular para lo que usted no desea hacer coincidir, como esto: (?!foo). La combinación de expresiones regulares pueden ser tan simples como unirlos con una tubería entre ellos, pero se puede hacer un poco mejor que en este caso. Esta expresión regular reutiliza la primera parte de las dos expresiones regulares, que es idéntica:

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

Debido a que el tubo (o '|', el operador alternancia) tiene menor prioridad que cualquier otra cosa, la alternancia tiene que estar contenido en un grupo. Nótese que he utilizado un grupo no captura - es decir, (?:...) - y se deshizo de los paréntesis en sus expresiones regulares. De lo contrario, habrían arrojado fuera de la numeración del un grupo que lo desea capturar, y que habrían tenido que usar algo distinto $1 en la segunda parte de la regla. Aquí está toda la expresión regular:

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

Edit: Al parecer, el sabor de expresiones regulares utilizado por AliasMatch no es compatible con los símbolos de anticipación, pero tiene su propia sintaxis negación: !(^/foo). Su objetivo parece ser el de negar toda la expresión regular, lo que significa que no le ayudaría, pero tal vez usted no lo necesita. Tal vez lo que puede ser alias de esos directorios a sí mismos. Entonces no tendría 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

O tal vez usted puede hacer algo con una directiva <DirectoryMatch>, o por el cambio a mod_rewrite. Pero estoy (obviamente) no es un experto Apache - mi especialidad es expresiones regulares, y no creo que una expresión regular va a resolver su problema

.

Otros consejos

modalias hace en soporte hecho de símbolos de anticipación negativos. Estoy usando esto en mi sitio, que funciona muy bien:

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

Asegúrese de tener su expresión regular comienzan con un "/", ya que siempre es el primer personaje con mod_alias! Nunca trate de iniciar su gobierno con una búsqueda hacia delante, o de lo contrario se producirá un error de análisis.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top