.htaccess isapi-rewrite

Redirigir URL que no sea www a www utilizando.htaccess



isapi-rewrite (7)

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

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

Estoy usando ISAPI Rewrite 3 de Helicon , que básicamente habilita .htaccess en IIS. Necesito redirigir una URL que no sea de www a la versión de www, es decir, example.com debe redireccionar 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?


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

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

Por supuesto que no se redireccionará, eso simplemente continuará como siempre


@Vinko

Para su enfoque genérico, no estoy seguro de por qué eligió limitar la longitud del TLD en su expresión regular. No es muy a prueba de futuro, y no estoy seguro de qué beneficio está proporcionando? 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ía simplemente hacer ^[^.]+/.[^.]/+$ ? (nota: ¡el signo de interrogación es parte de la oración, no la expresión regular!)

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

Ya sea que eso sea o no de interés para el OP, no lo sé, pero es algo a tener en cuenta si buscas una respuesta "soluciona todo".

El OP todavía no ha aclarado si quiere una solución genérica o una solución para un dominio único (o pequeño) de dominios conocidos. Si es el último, vea mi otra nota sobre el uso del enfoque de Zigdon. Si es el primero, proceda con el enfoque de Vinko teniendo en cuenta la información en esta publicación.

Editar: Una cosa que he omitido hasta ahora, que puede o no ser una opción para usted, es ir por el otro camino. Todos nuestros sitios redirigen http://www.domain.com a http://domain.com . La gente en http://no-www.org es un caso bastante bueno (en mi humilde opinión) porque esta es la forma "correcta" de hacerlo, pero aún así es solo una cuestión de preferencia. Una cosa es segura, es mucho más fácil escribir una regla genérica para ese tipo de redirección que esta.


@org 0100h Sí, hay muchas variables que quedan fuera de la descripción del problema, y ​​todos sus puntos son válidos y deberían abordarse en el caso de una implementación real. Existen ventajas y desventajas para su expresión regular propuesta. Por un lado, es más fácil y a prueba de futuro, por otro lado, ¿de verdad quieres unir example.foobar si se envía en el encabezado Host? Puede haber algunos casos extremos en los que terminarás redirigiendo 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 cambiará% 1)

@chrisofspades No está destinado a reemplazarlo, su condición número dos asegura que no tiene www, mientras que el mío no. No cambiará los valores de% 1,% 2,% 3 porque no almacena las coincidencias (por ejemplo, no usa paréntesis).


Añada el siguiente RewriteCond:

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

De esta forma, solo aplicará la regla a no menos de un cierto número de cupones como puede ver, subdomain.domain.com no coincidirá con la condición y, por lo tanto, no se reescribirá.

Puede cambiar [az] {2,5} para obtener una expresión regular de tld más estricta, así como colocar todas las restricciones para los caracteres permitidos en los nombres de dominio (ya que [^.] + Es más permisivo de lo estrictamente necesario).

En general, creo que en este caso eso no sería necesario.

EDITAR: sadie detectó un defecto en la expresión regular, cambió la primera parte de [^.] A [^.] +


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

^example/.com$

en lugar de su sugerencia de:

^example/.com(.*)

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


Obtuve más control usando urlrewriter.net , algo así 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>