iis-7 - redirigir - url rewrite iis 8
Reescritura de URL de IIS7: ¿cómo no eliminar el protocolo HTTPS de la URL reescrita? (4)
Estoy trabajando en un sitio web que usa la función de reescritura de URL de IIS 7 para hacer un redireccionamiento permanente de example.com a www.example.com, así como también reescribe desde nombres de dominio similares al "principal", como por ejemplo desde www. examples.com a www.example.com.
Esta regla de reescritura, que se muestra a continuación, ha funcionado bien desde hace un tiempo. Sin embargo, recientemente agregamos compatibilidad con HTTPS y notamos que si los usuarios visitan una de las URL que se reescribirán en www.example.com, se eliminará HTTPS. Por ejemplo, si un usuario visita https://example.com , se le redirige a http://www.example.com , mientras que nos gustaría que se le envíe a https://www.example.com .
Aquí está la regla de reescritura de interés (en Web.config):
<rule name="Canonical Host Name" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTP_HOST}" pattern="^example/.com$" />
<add input="{HTTP_HOST}" pattern="^(www/.)?example/.net$" />
<add input="{HTTP_HOST}" pattern="^(www/.)?example/.info$" />
<add input="{HTTP_HOST}" pattern="^(www/.)?examples/.com$" />
</conditions>
<action type="Redirect" url="http://www.example.com/{R:1}" redirectType="Permanent" />
</rule>
Como puede ver, el atributo url del elemento de acción apunta directamente a http: //, así que entiendo por qué https://example.com se redirige a http://www.example.com . Mi pregunta es, ¿cómo soluciono esto? Intenté (ingenuamente) simplemente colocar la parte http: // del atributo url, pero eso no funcionó.
Aquí está la respuesta de Scott con las mejoras de Hasan. Esto debería cubrir sitios mixtos SSL / no SSL. La regla básicamente dice "si la url no tiene www.example.com", haz una redirección permanente a ella. Básicamente ... está redirigiendo a las personas que lo visitan sin www o directamente a su dirección IP.
<rewrite>
<rules>
<rule name="Canonical Host Name" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" pattern="^www/.example/.com$" negate="true" />
</conditions>
<action type="Redirect" url="{MapSSL:{HTTPS}}www.example.com/{R:1}" redirectType="Permanent" />
</rule>
</rules>
<rewriteMaps>
<rewriteMap name="MapSSL" defaultValue="http://">
<add key="ON" value="https://" />
<add key="OFF" value="http://" />
</rewriteMap>
</rewriteMaps>
</rewrite>
Aquí hay una solución de dominio cruzado que funciona no solo en example.com
sino también en cualquier dominio
<rewrite>
<rules>
<rule name="Canonical Host Name" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" pattern="^www/.([.a-zA-Z0-9]+)$" negate="true" />
</conditions>
<action type="Redirect" url="{MapProtocol:{HTTPS}}www.{HTTP_HOST}/{R:0}" redirectType="Permanent" />
</rule>
</rules>
<rewriteMaps>
<rewriteMap name="MapProtocol" defaultValue="OFF">
<add key="ON" value="https://" />
<add key="OFF" value="http://" />
</rewriteMap>
</rewriteMaps>
</rewrite>
Encontré la respuesta con la ayuda de mis colegas.
Necesitaba usar varias reglas con una condición en {HTTPS}. Tenga en cuenta la condición {HTTPS} en las reglas a continuación.
<rule name="Canonical Host Name (HTTP)" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTPS}" pattern="OFF" />
<add input="{HTTP_HOST}" pattern="^example/.com$" />
</conditions>
<action type="Redirect" url="http://www.example.com/{R:1}" redirectType="Permanent" />
</rule>
<rule name="Canonical Host Name (HTTPS)" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTPS}" pattern="ON" />
<add input="{HTTP_HOST}" pattern="^example/.com$" />
</conditions>
<action type="Redirect" url="https://www.example.com/{R:1}" redirectType="Permanent" />
</rule>
Luego repetí el par de reglas arriba para los nombres de dominio alternativos.
Si solo desea redirigir en función del protocolo utilizado actualmente (según su última muestra), entonces hay una solución mucho más simple que reducirá a la mitad la cantidad de reglas que necesitará. Lo siguiente es lo que aprendí de un colega mío.
Como has visto, el argumento {HTTPS} contendrá el valor ENCENDIDO o APAGADO. Puede asignar este valor a https: // o http: // introduciendo este valor en un rewritemap.
Así es como esto funcionaría:
1- Crea una sección de reescritura para mapear el valor {HTTPS}:
<rewriteMap name="MapProtocol" defaultValue="OFF">
<add key="ON" value="https://" />
<add key="OFF" value="http://" />
</rewriteMap>
Depende de usted decidir si solo desea incluir el protocolo, o el punto y coma y las barras diagonales. No importa la solución, pero téngalo en cuenta siempre que se refiera a él.
2- Consulte este mapa donde lo necesite. En esta muestra, se usa en reglas de salida, pero también funcionará en su escenario:
<rule name="Outbound-Rule Name" stopProcessing="true" preCondition="ResponseIsHtml">
<match filterByTags="A, Link, Script" pattern="YOUR PATTERN" />
<action type="Rewrite" value="{MapProtocol:{HTTPS}}{HTTP_HOST}/REST OF RELATIVE LINK HERE" />
</rule>
Eso es todo, el módulo de Reescritura de URL ahora debería usar automágicamente el protocolo correcto para sus enlaces, dependiendo de si está usando https o, por supuesto, http.
¡Espero que esto ayude!