Pregunta

tengo un RewriteMap Eso se ve así:

Guide           1
Mini-Guide      2
White Paper     3

Y lo incluyo en Apache a través de

RewriteMap legacy txt:/var/www/site/var/rewrite_map.txt

Quiero crear un RewriteRule que solo permitirán valores del lado izquierdo de dicho RewriteMap estar en esta posición;

RewriteRule ^/section/downloads/(${legacy})/(.*)$ /blah.php?subsection=${legacy:%1}&title=$2

Sé que puedo usar ${legacy} En el lado derecho, pero ¿puedo usarlo a la izquierda y, de ser así, cómo?

¿Fue útil?

Solución

En su archivo de mapa, el lado izquierdo es la clave y el lado derecho es el valor. Cuando crea una regla para coincidir con un mapa, ingresa la clave y genera el valor.

Cambie su rewriterule a esto:

# Put these on one line
RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
            /blah.php?subsection=${legacy:$1}&title=$2

La primera agrupación captura la cadena en la URL entrante. Los $ 1 en el reemplazo lo aplican al mapa nombrado. Para hacer un valor predeterminado, cambie ${legacy:$1} a ${legacy:$1|Unknown}.

Finalmente, si solo desea que la regla funcione en valores que se encuentran en el archivo de mapa, agregue un RewriteCond:

RewriteCond ${legacy:$1|Unknown} !Unknown
# Put these on one line
RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
            /blah.php?subsection=${legacy:$1}&title=$2

La condición dice que si el mapa no devuelve el valor predeterminado (Unknown), luego ejecute la siguiente regla. De lo contrario, omita la regla y sigue adelante.

Apache RewriteMap

Otros consejos

Otra variante:

# %1 will be the subpattern number1 afterwards
RewriteCond %{REQUEST_URI} ^/section/downloads/(.*)
# check if there is no mapping for %1
RewriteCond ${legacy:%1} !^$
# if there is rewrite it
RewriteRule ^/(.*) /blah.php?subsection=${legacy:%1}&title=$2 [R]

Dijiste, solo quieres permitir valores encontrados en el mapa. Esto no es posible a menos que especifique una restricción adicional en Regex para el grupo de captura. No hay forma de hacerlo con el mapa en sí. No hay sintaxis de "map. keys", hasta donde yo sé, que puedes aplicar en el lado izquierdo, el patrón.

PERO,
Puede especificar un valor predeterminado si no se encuentra el valor capturado. De esta manera:

## all on one line
RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
        /blah.php?subsection=${legacy:$1|defaultValue}&title=$2

Reemplace "DefaultValue" con lo que quiera. Por ejemplo, 0 (cero), o "no más importante", si el arg dado no se encuentra en el mapa.

Luego puede reescribir el resultado de eso, con otra regla, o simplemente permitir que fluya y proporcionar un mensaje "404" en la URL con el valor predeterminado.

Si elige usar otra regla, se vería así:

## all on one line
RewriteRule ^/section/downloads/([a-zA-Z-]+)/(.*)$
        /blah.php?subsection=${legacy:$1|notFoundMarker}&title=$2

## This rule fires if the lookupKey was not found in the map in the prior rule.
RewriteRule ^/blah.php?subsection=notFoundMarker  /404.php   [L]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top