Réécriture D'URL IIS7: Comment ne pas supprimer le protocole HTTPS de L'URL réécrite?
Je travaille sur un site web qui utilise la fonctionnalité de réécriture D'URL D'IIS 7 pour effectuer une redirection permanente depuis example.com pour www.example.com, ainsi que des réécritures de noms de domaine similaires à celui "principal", tels que de www.examples.com pour www.example.com.
Cette règle de réécriture - montrée ci-dessous-a bien fonctionné pendant un certain temps maintenant. Cependant, nous avons récemment ajouté le support HTTPS et remarqué que si les utilisateurs visitent l'une des URL à réécrire www.example.com ensuite, HTTPS est supprimé. Par exemple, si un utilisateur visite https://example.com ils être redirigé vers http://www.example.com, alors que nous le souhaiterions être envoyé à https://www.example.com.
Voici la règle de réécriture d'intérêt (dans le 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>
Comme vous pouvez le voir, l'attribut url de l'élément action pointe directement vers http://, donc je comprends pourquoi https://example.com {[5] } est redirigé vers http://www.example.com . Ma question Est, Comment puis-je résoudre ce problème? J'ai essayé (naïvement) de laisser tomber la partie http: / / de l'attribut url, mais cela n'a pas fonctionné.
4 réponses
Voici la réponse de Scott avec les améliorations de Hasan. Cela devrait couvrir les sites SSL/non-SSL mixtes. La règle dit essentiellement "si l'url n'a pas www.example.com", faire une redirection permanente vers elle. Essentiellement... vous redirigez les personnes qui vous visitent sans www ou directement à votre adresse 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>
Trouvé la réponse avec l'aide de mes collègues.
J'avais besoin d'utiliser plusieurs règles avec une condition sur {HTTPS}. Notez la condition {HTTPS} dans les règles ci-dessous.
<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>
J'ai ensuite répété la paire de règles ci-dessus pour les noms de domaine alternatifs.
Si vous voulez juste rediriger en fonction du protocole actuellement utilisé (selon votre dernier exemple), il existe une solution beaucoup plus simple qui réduira de moitié le nombre de règles dont vous aurez besoin. Ce qui suit est ce que j'ai appris d'un collègue de la mine.
Comme vous l'avez vu, l'argument {HTTPS} contiendra la valeur ON ou OFF. Vous pouvez mapper cette valeur à https: / / ou http: / / en insérant cette valeur dans un rewritemap.
Voici comment cela fonctionnerait:
1-Créer une section rewritemap pour mapper la valeur {HTTPS}:
<rewriteMap name="MapProtocol" defaultValue="OFF">
<add key="ON" value="https://" />
<add key="OFF" value="http://" />
</rewriteMap>
C'est à vous de décider si vous voulez inclure uniquement le protocole, ou le point-virgule et les barres obliques. Peu importe la solution, mais gardez-la à l'esprit partout où vous y faites référence.
2-reportez-vous à cette carte partout où vous en avez besoin. Dans cet exemple, il est utilisé dans les règles sortantes, mais cela fonctionnera également dans votre scénario:
<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>
Voilà, le module de réécriture D'URL devrait maintenant utiliser automagiquement le protocole correct pour vos liens selon si vous utilisez https, ou, bien sûr, http.
Espérons que cela aide!
Voici une solution inter-domaines qui fonctionne non seulement sur example.com
mais aussi sur n'importe quel domaine
<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>