2012-02-02 13 views
13

estoy usando estas dos reglas en mi archivo web.config:IIS reescritura de URL: Hacer cumplir el nombre canónico y redirigir HTTP a HTTPS

<rule name="Enforce canonical hostname" stopProcessing="true"> 
     <match url="(.*)" /> 
     <conditions> 
     <add input="{HTTP_HOST}" negate="true" pattern="^www\.example\.com$" /> 
     </conditions> 
     <action type="Redirect" url="https://www.example.com/{R:1}" redirectType="Permanent" /> 
    </rule> 
    <rule name="HTTP to HTTPS redirect" stopProcessing="true"> 
     <match url="(.*)" /> 
     <conditions> 
     <add input="{HTTPS}" pattern="off" ignoreCase="true" /> 
     </conditions> 
     <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" /> 
    </rule> 

Con estas dos reglas me sale el siguiente Redirigir a trabajar:

  1. http://www.example.com --->https://www.example.com
  2. http://example.com--->https://www.example.com
  3. https://example.com ---> esto no puede volver directo a https://www.example.com ... ¿Por qué?
+0

Apenas llegando, tiene que definitivamente tiene el texto a la derecha en el punto 2 anterior - que http://mysite.com redirecciones con éxito a http * s *: //www.mySite.com? –

+0

No distinguen entre mayúsculas y minúsculas, ¿verdad? - en algunos lugares has usado mySite, en otros mysite (por ejemplo en el ítem 3). –

+0

acabo de utilizar la dirección www.misitio.com en lugar de mi dirección real :) –

Respuesta

22

No estoy seguro si aún está buscando una respuesta, pero aquí va. Después de algunas búsquedas y pruebas y errores, encontré el éxito con las siguientes reglas. La mayoría de los ejemplos que he encontrado son innecesariamente complejos en lo que respecta a la coincidencia de patrones e introducen otras variables que impiden que las reglas funcionen según lo previsto. Las siguientes reglas se pueden aplicar a cualquier sitio web, y nada es no modificable por lo que siempre debe ser un trabajo de copia y pegar directamente:

<rule name="Redirect to WWW" stopProcessing="true" > 
    <match url="(.*)" /> 
    <conditions> 
     <add input="{HTTP_HOST}" pattern="^www\." negate="true"/> 
    </conditions> 
    <action type="Redirect" url="https://www.{HTTP_HOST}{HTTP_URL}" redirectType="Permanent" appendQueryString="false" /> 
</rule> 
<rule name="Redirect to HTTPS"> 
    <match url="(.*)" /> 
    <conditions> 
     <add input="{HTTPS}" pattern="OFF"/> 
    </conditions> 
    <action type="Redirect" url="https://{HTTP_HOST}{HTTP_URL}" redirectType="Permanent" appendQueryString="false" /> 
</rule> 

Dos cosas a tener en cuenta: redirectType = "permanente" va resultará en la regla aplicada hasta que se vacíe el historial/caché del navegador; esto debería ser algo bueno ya que el navegador haría el trabajo en el futuro. Además, appendQueryString = "false" es necesario ya que la variable de servidor {HTTP_URL} ya incluye la cadena de consulta completa; de manera predeterminada, la opción es "verdadera" y daría como resultado cadenas de búsqueda duplicadas aquí.

+0

Esta es la mejor solución que he encontrado. La mayoría de los otros ejemplos codifican el nombre de dominio, pero este no, por lo que es mucho más poderoso. –

+0

¡increíble! Gracias –

5

Si es para beneficio de nadie, esto es lo mismo que se obtiene con una sola regla:

<rule name="Redirect HTTP to HTTPS and non-WWW to WWW" stopProcessing="true"> 
    <match url="(.*)"/> 
    <conditions trackAllCaptures="false" logicalGrouping="MatchAny"> <!-- match non-HTTPS or non-WWW --> 
     <add input="{HTTPS}" pattern="^OFF$"/> <!-- if connection not secure --> 
     <add input="{HTTP_HOST}" matchType="Pattern" ignoreCase="true" pattern="^example\.com$" /><!-- domain is not canonical --> 
    </conditions> 
    <action type="Redirect" url="https://www.example.com{HTTP_URL}" redirectType="Permanent" appendQueryString="false"/> 
</rule> 
Cuestiones relacionadas