Este es mi archivo .htaccess :
RewriteEngine On <If "%{HTTP_HOST} == '<myHost>'"> RewriteRule ^$ <url> [R=301,L] </If> <Else> RewriteRule ^$ <another_url> [R=301,L] </Else> Pero no funciona y parece que se ignora la instrucción <If> . También hice un eco de $_SERVER['HTTP_HOST'] en PHP y ahí obtengo el valor que esperaba. Además, RewriteRule funciona si elimino la instrucción If/Else.
Estoy usando Azure Webapp con Apache/2.4.38 (Debian)
Dentro del bloque if y else puede usar la directiva RedirectMatch ya que funciona con ella. RewriteRule no funciona porque anula y entra en conflicto con IF/ELSE.
RewriteEngine On <If "%{HTTP_HOST} == '<myHost>'"> RedirectMatch 301 ^/$ https://example.com </If> <Else> RedirectMatch ^/$ https://example2.com </Else>La instrucción <If> no se ignora. El "problema" es que cuando se usa dentro de una expresión <If> , el patrón RewriteRule coincide con la ruta absoluta del sistema de archivos, no con la ruta URL solicitada que espera.
El bloque <If> cambia el orden de procesamiento. Los bloques <If> se fusionan muy tarde , después de que los archivos .htaccess se procesan normalmente y aparentemente después de que la solicitud se haya reasignado al sistema de archivos (es decir, después de que se haya agregado nuevamente el prefijo del directorio).
Con esto en mente, puede cambiar sus reglas a lo siguiente para que esto funcione:
<If "%{HTTP_HOST} == '<myHost>'"> RewriteRule ^/file/path/to/document-root/$ <url> [R=301,L] </If> <Else> RewriteRule ^/file/path/to/document-root/$ <another_url> [R=301,L] </Else> Donde /file/path/to/document-root/ es la ruta absoluta del sistema de archivos al directorio raíz de su documento (donde la ruta URL / se asigna a).
Como alternativa, verifique la ruta de la URL utilizando la variable de servidor REQUEST_URI en una condición. Por ejemplo:
<If "%{HTTP_HOST} == '<myHost>'"> RewriteCond %{REQUEST_URI} =/ RewriteRule ^ <url> [R=301,L] </If> <Else> RewriteCond %{REQUEST_URI} =/ RewriteRule ^ <another_url> [R=301,L] </Else> O bien, marque la REQUEST_URI en las expresiones <If> (y <ElseIf> ). En Apache 2.4.26+ puede anidar expresiones. Por ejemplo:
<If "%{REQUEST_URI} == '/'"> <If "%{HTTP_HOST} == '<myHost>'"> RewriteRule ^ <url> [R=301,L] </If> <Else> RewriteRule ^ <another_url> [R=301,L] </Else> </If> O use una directiva mod_alias RedirectMatch dentro de la expresión <If> , como se sugiere en la respuesta de @AmitVerma. Las directivas mod_alias RedirectMatch (y Redirect ) siempre hacen referencia a la ruta URL solicitada (relativa a la raíz), independientemente del contexto, por lo que no obtiene esta ambigüedad como con mod_rewrite.
O simplemente use mod_rewrite, no hay necesidad de la expresión <If> / <Else> aquí. por ejemplo:
RewriteCond %{HTTP_HOST} =<myHost> RewriteRule ^$ <url> [R=301,L] RewriteRule ^$ <another_url> [R=301,L]