apache - ifmodule - mod_rewrite htaccess
Varias reglas de reescritura para RewriteCond individual en.htaccess (4)
Tengo el siguiente comando en mi .htaccess
RewriteCond %{HTTP_HOST} ^(www/.)?([a-z0-9-]+)/.example/.com [NC]
RewriteRule ^(.*?)-([a-z]+) %2/$1.$2 [L]
RewriteRule ^(.*?)-([0-9]+)([a-z]) %2/$1$3.$2 [L]
% 2 no funciona en la segunda y últimas líneas. ¿Puedo definir cualquier variable para% 2 y usarla en todos los comandos RewriteRule? Siguiente comando funciona
RewriteCond %{HTTP_HOST} ^(www/.)?([a-z0-9-]+)/.example/.com [NC]
RewriteRule ^(.*?)-([a-z]+) %2/$1.$2 [L]
RewriteCond %{HTTP_HOST} ^(www/.)?([a-z0-9-]+)/.example/.com [NC]
RewriteRule ^(.*?)-([0-9]+)([a-z]) %2/$1$3.$2 [L]
Pero quiero usar% 2 para línea de regla múltiple sin duplicar condición.
Claramente, esto no es muy divertido, especialmente a medida que las cosas crecen y se vuelven más complejas. Sin embargo, hay una opción menos conocida de la sentencia RewriteRule, que le dice a apache que saltee el próximo número N de la instrucción RewriteRule. [S = N] Entonces, en lugar de verificar cada vez si la solicitud NO es un archivo Y NO es un directorio, podríamos hacer lo siguiente: Bloquear el código
#
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [S=3]
RewriteRule ^([^./]+)/$ http://www.santweb.co.uk/$1 [L]
RewriteRule ^([^./]+)/([^./]+)/$ http://www.santweb.co.uk/$1/$2 [L]
RewriteRule ^([^./]+)/([^./]+)/([^./]+)/$ http://www.santweb.co.uk/$1/$2/$3 [L]
#
Encontré esto en: http://www.sant-media.co.uk/2010/03/applying-rewritecond-to-multiple-rewriterule-in-htaccess/
Creo que es útil
La variable se debe guardar como una var de Apache, luego se puede usar sin condiciones repetidas.
El ahorro en las variables de Apache se muestra en la segunda línea. Uso de vars guardados en 3ª y 4ª líneas.
RewriteCond %{HTTP_HOST} ^(www/.)?([a-z0-9-]+)/.example/.com [NC]
RewriteRule .? - [E=Wa:%1,E=Wb:%2]
RewriteRule ^(.*?)-([a-z]+) %{ENV:Wb}/$1.%{ENV:Wb} [L]
RewriteRule ^(.*?)-([0-9]+)([a-z]) %{ENV:Wb}/$1$3.$2 [L]
Normalmente, no puede usar varias instrucciones RewriteRule después de una sola RewriteCond. Pero puede hacer un pequeño truco a sus condiciones si lo desea, como se ve en:
https://serverfault.com/questions/162586/one-rewritecond-for-multiple-rewriterules
o
http://www.sant-media.co.uk/2010/03/applying-rewritecond-to-multiple-rewriterule-in-htaccess/
Puede usar el indicador S|skip
de RewriteRule para unir múltiplos RewriteRules a un solo RewriteCond (oa un conjunto de RewriteConds). Aquí hay un ejemplo que aplica un Cond a tres Reglas:
RewriteCond %{HTTP_HOST} !^www.mydomain.com$
# skip rules if NOT within domain - only way to tie multiple rules to one cond
RewriteRule .? - [S=3]
RewriteRule ^path1(/.*)$ /otherpath1$1
RewriteRule ^path2(/.*)$ /otherpath2$1
RewriteRule ^path3(/.*)$ /otherpath3$1
Para cambiar un Cond existente para que funcione para varias Reglas, debe:
- Negar la condición (anteponerla!)
- Si tienes múltiples RewriteConds:
Cambie los AND lógicos en los Conds a los OR y viceversa. - Agregue una regla de reescritura de saltos delante de todas las reglas que desee vincular a la (s) condición (es). Establezca el parámetro S en el número de líneas de regla que se omitirán.
Tenga en cuenta que no es posible utilizar referencias posteriores que indiquen RewriteCond (como% 1) en las Reglas omitidas. Solo se puede acceder a ellos en la sección RewriteRule.