2008-09-08 20 views
6

Estoy usando Helicon's ISAPI Rewrite 3, lo 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. He utilizado la siguiente regla de los ejemplos pero afecta subdominios:Redirigir URL que no sea www a www usando .htaccess

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

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

Respuesta

3

Añada la siguiente RewriteCond:

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

esa manera que sólo va a aplicar la regla a nondottedsomething.uptofiveletters como se puede ver, subdomain.domain.com no coincidirán con las condiciones y de esta manera te no ser reescrito

Puede cambiar [a-z] {2,5} para obtener una expresión regular de tld más estricta, así como colocar todas las restricciones para caracteres permitidos en 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.

EDIT: Sadie vio un defecto en la expresión regular, cambió la primera parte de la misma a partir de [^.] A [^.] +

+0

¿Dice que debería reemplazar la línea 2 con su condición o agregar su condición en una nueva línea? ¿Agregarlo en una nueva línea afectará al RewriteRule usando el% 1,% 2 y% 3? – chrisofspades

0

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

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

debería ser^example \ .com $ en su lugar. En cualquier caso, tengo la impresión de que Chris quiere una solución genérica, no una para un solo dominio. –

1

He conseguido un mayor control utilizando 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> 
0

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

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

Por supuesto que suele re-directa, que se acaba de llevar a cabo de forma normal

1

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

^example\.com$

en lugar de su sugerencia de:

^example\.com(.*)

De lo contrario, no será sólo emparejando example.com, se le emparejando las cosas como example.comcast.net, example.com.au, etc.

1

@Vinko

Para su enfoque genérico, no estoy seguro de WH ¿Elegiste limitar la longitud del TLD en tu 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ías 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, que es: fallará para los 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.

Independientemente de que sea o no de interés para el OP, no lo sé, pero es algo a tener en cuenta si lo que busca es una respuesta "solucione todo".

El OP aún 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 en cuanto a negocios, es ir por el otro camino. Todos nuestros sitios redireccionan 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.

1

@org 0100h Sí, hay muchas variables que quedan fuera de la descripción del problema, y ​​todos sus puntos son válidos y deben 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 el otro, ¿realmente quieres hacer coincidir 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 alternativa thrid es la modificación de la expresión regular a utilizar una lista de los dominios reales, si hay más de uno, como

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

(Nota a Chris, que uno se% de cambio 1)

@chrisofspades Es no 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).

Cuestiones relacionadas