Pregunta

Estoy usando Reescritura 3 de ISAPI de Helicon, que básicamente habilita .htaccess en IIS.Necesito redirigir una URL que no sea www a la versión www, es decir.example.com debería redirigir a www.example.com.Utilicé la siguiente regla de los ejemplos pero afecta a los subdominios:

RewriteCond %{HTTPS} (on)?
RewriteCond %{HTTP:Host} ^(?!www\.)(.+)$ [NC]
RewriteCond %{REQUEST_URI} (.+)
RewriteRule .? http(?%1s)://www.%2%3 [R=301,L]

Esto funciona en su mayor parte, pero también redirige sub.example.com a www.sub.example.com.¿Cómo puedo reescribir la regla anterior para que los subdominios no sean redirigidos?

¿Fue útil?

Solución

Agregue la siguiente RewriteCond:

RewriteCond %{HTTP:Host} ^[^.]+\.[a-z]{2,5}$ [NC]

De esa manera, solo aplicará la regla a algo sin puntos. Hasta cinco letras, como puede ver, subdominio.dominio.com no coincidirá con la condición y, por lo tanto, no se reescribirá.

Puede cambiar [a-z]{2,5} por una expresión regular de coincidencia de tld más estricta, además de colocar todas las restricciones para los caracteres permitidos en los nombres de dominio (ya que [^.]+ es más permisivo de lo estrictamente necesario).

Considerándolo todo creo que en este caso eso no sería necesario.

EDITAR:Sadie detectó un defecto en la expresión regular y cambió la primera parte de [^.] a [^.]+

Otros consejos

He conseguido más control usando urlrewriter.net, algo como:

<unless header="Host" match="^www\.">
   <if url="^(https?://)[^/]*(.*)$">
     <redirect to="$1www.domain.tld$2"/>
   </if>
   <redirect url="^(.*)$" to="http://www.domain.tld$1"/>
</unless>

Zigdon tiene la idea correcta, excepto que su expresión regular no es del todo correcta.Usar

^example\.com$

en lugar de su sugerencia de:

^example\.com(.*)

De lo contrario, no solo coincidirá con example.com, sino que coincidirá con cosas como example.comcast.net, example.com.au, etc.

@vinko

Para su enfoque genérico, no estoy seguro de por qué eligió limitar la longitud del TLD en su expresión regular.No está muy preparado para el futuro y no estoy seguro de qué beneficio ofrece.En realidad, ni siquiera es "a prueba de ahora" porque hay al menos un TLD de 6 caracteres (.museum) que no coincidirá.

Me parece innecesario hacer esto.¿No podrías simplemente hacer ^[^.]+\.[^.]\+$?(nota:¡el signo de interrogación es parte de la oración, no la expresión regular!)

Aparte de todo eso, hay un problema mayor con este enfoque que es:fallará en dominios que no estén directamente debajo del TLD.Se trata de dominios en Australia, Reino Unido, Japón y muchos otros países, que tienen jerarquías:.co.jp, .co.uk, .com.au, etc.

Si eso preocupa o no al OP, no lo sé, pero es algo que debes tener en cuenta si buscas una respuesta de "arreglar todo".

El OP aún no ha dejado claro si quiere una solución genérica o una solución para un único (o pequeño grupo) de dominios conocidos.Si es lo último, consulte mi otra nota sobre el uso del enfoque de Zigdon.Si es lo primero, entonces continúa con el enfoque de Vinko teniendo en cuenta la información de esta publicación.

Editar:Una cosa que he omitido hasta ahora, que puede ser o no una opción para usted desde el punto de vista empresarial, es ir por el otro lado.Todos nuestros sitios redireccionan http://www.dominio.com a http://dominio.com.la gente de http://no-www.org Es un caso bastante bueno (en mi humilde opinión) para que esta sea la forma "correcta" de hacerlo, pero ciertamente sigue siendo solo una cuestión de preferencia.Sin embargo, una cosa es segura: es mucho más fácil escribir una regla genérica para ese tipo de redirección que ésta.

@org 0100h Sí, quedan muchas variables fuera de la descripción del problema, y ​​todos sus puntos son válidos y deben abordarse en caso de una implementación real.La expresión regular propuesta tiene ventajas y desventajas.Por un lado, es más fácil y está preparado para el futuro; por otro, ¿realmente desea hacer coincidir el archivo example.foobar si se envía en el encabezado del Host?Puede haber algunos casos extremos en los que terminarás redireccionando al dominio equivocado.Una tercera alternativa es modificar la expresión regular para usar una lista de los dominios reales, si hay más de uno, como

RewriteCond %{HTTP:Host} (example.com|example.net|example.org) [NC]

(Nota para Chris, ese voluntad cambiar %1)

@chrisofspades No pretende reemplazarlo, su condición número dos garantiza que no tenga www, mientras que la mía no.No cambiará los valores de %1, %2, %3 porque no almacena las coincidencias (es decir, no usa paréntesis).

¿No puedes ajustar RewriteCond para que solo funcione en example.com?

RewriteCond %{HTTP:Host} ^example\.com(.*) [NC]

¿Por qué no tienes algo como esto en tu archivo vhost (de httpd)?

ServerName: www.example.com
ServerAlias: example.com

Por supuesto que eso no redireccionará, continuará normalmente.

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