web-dev-qa-db-fra.com

web.config redirige les non-www vers www

J'ai besoin de rediriger les URL non-www vers www url pour les URL http et https. J'ai essayé de suivre les règles de web.config.

<rule name="Redirect to WWW" stopProcessing="true">
<match url=".*" />
<conditions>
    <add input="{HTTP_Host}" pattern="^domain.com$" />
</conditions>
<action type="Redirect" url="http://www.domain.com/{R:0}" redirectType="Permanent" />

<rule name="Redirect to WWW https" stopProcessing="true">
<match url=".*" />
<conditions>
    <add input="{HTTPS}" pattern="^domain.com$" />
</conditions>
<action type="Redirect" url="https://www.domain.com/{R:0}" redirectType="Permanent" />

Cela fonctionne parfaitement pour les URL non-ssl mais en cas de ssl, il redirige de https://domain.com vers http://www.domain.com

S'il vous plaît aidez-moi à corriger mes règles.

32
Anand

Pour une règle plus sûre qui fonctionne pour les situations Match Any et Match All, vous pouvez utiliser la solution Rewrite Map. C’est une très bonne solution, dont le seul inconvénient est le très léger effort supplémentaire à effectuer pour la configurer, car vous devez créer une carte de réécriture avant de créer la règle. En d’autres termes, si vous choisissez d’utiliser cette méthode comme unique méthode de gestion du protocole, vous serez en sécurité.

Vous pouvez créer une carte de réécriture appelée MapProtocol. Vous pouvez utiliser {MapProtocol:{HTTPS}} pour le protocole dans toute action de règle. 

<rewrite>
  <rules>
    <rule name="Redirect to www" stopProcessing="true">
      <match url="(.*)" />
      <conditions trackAllCaptures="false">
        <add input="{HTTP_Host}" pattern="^domain.com$" />
      </conditions>
      <action type="Redirect" 
        url="{MapProtocol:{HTTPS}}://www.domain.com/{R:1}" />
    </rule>
  </rules>
  <rewriteMaps>
    <rewriteMap name="MapProtocol">
      <add key="on" value="https" />
      <add key="off" value="http" />
    </rewriteMap>
  </rewriteMaps>
</rewrite>

Référence

48
Satpal

D'autres réponses sont inutiles, voici la règle que j'utilise (il suffit de copier/coller):

<rule name="ensurewww" stopProcessing="true">
  <match url=".*" />
  <conditions>
    <add input="{CACHE_URL}" pattern="^(.+)://(?!www)(.*)" />
  </conditions>
  <action type="Redirect" url="{C:1}://www.{C:2}" redirectType="Permanent" />
</rule>

Cela redirigera vers la version www tout en préservant les protocoles HTTP et HTTPS

J'espère que cela t'aides.

5
Chtiwi Malek

Depuis 2018, envisagez d'utiliser à chaque fois https (SSL)!

J'utilise donc rediriger vers www et https ensemble.

<rule name="Redirect to www" stopProcessing="true">
    <match url="(.*)" />
    <conditions trackAllCaptures="false">
        <add input="{HTTP_Host}" pattern="^domain.com$" />
    </conditions>
    <action type="Redirect" url="https://www.comain.com/{R:1}" redirectType="Permanent" />
</rule>

<rule name="HTTP/S to HTTPS Redirect" enabled="true" stopProcessing="true">
    <match url="(.*)" />
    <conditions logicalGrouping="MatchAny">
        <add input="{SERVER_PORT_SECURE}" pattern="^0$" />
    </conditions>
    <action type="Redirect" url="https://{HTTP_Host}{REQUEST_URI}" redirectType="Permanent" />
</rule>

plus d'infos ici: https://forums.realmacsoftware.com/t/effective-july-2018-google-s-chrome-browser-will-mark-non-https-sites-as-not- sécurisé/18597

5
Meloman

Je sais que ceci est un ancien post, mais il n'a pas été complètement répondu. J'ai fini par rallonger Satpals answer

La première règle attrape http + www et la seconde attrape les non-www

Pour une raison quelconque, je ne pouvais pas utiliser MapProtocol dans la première règle, mais cela fonctionne avec https écrit directement dans l'URL.

<rewrite>
  <rules>
    <rule name="Special case www &amp; HTTPS off" enabled="true" stopProcessing="true">
      <match url="(.*)" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTP_Host}" pattern="^www\.example\.com$" />
        <add input="{HTTPS}" pattern="off" />
      </conditions>
      <action type="Redirect" url="https://www.example.com/{R:1}" redirectType="SeeOther" />
    </rule>
    <rule name="Redirect to www &amp; HTTPS" enabled="true" stopProcessing="true">
      <match url="(.*)" />
      <conditions trackAllCaptures="false">
        <add input="{HTTP_Host}" pattern="^example\.com$" />
      </conditions>
      <action type="Redirect" url="{MapProtocol:{HTTPS}}://www.example.com/{R:1}" redirectType="SeeOther" />
    </rule>
  </rules>
  <rewriteMaps>
    <rewriteMap name="MapProtocol">
      <add key="on" value="https" />
      <add key="off" value="http" />
    </rewriteMap>
  </rewriteMaps>
</rewrite>
1
southz rgw