2012-02-02 9 views
13

sto usando queste due regole nel mio file web.config:IIS URL Rewriting: Applicare hostname canonico e HTTP a HTTPS reindirizzare

<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 queste due regole ottengo il seguente Redirect a lavorare:

  1. http://www.example.com --->https://www.example.com
  2. http://example.com--->https://www.example.com
  3. https://example.com ---> questo non riesce a ri diretto a https://www.example.com ... Perché?
+0

Stavo solo controllando, avete sicuramente ottenuto il testo giusto al precedente punto 2 - che http://mysite.com redirect con successo su http * s *: //www.mySite.com? –

+0

Non fanno distinzione tra maiuscole e minuscole? - in alcuni punti hai utilizzato mySite, in altri mysite (ad esempio nell'elemento 3). –

+0

Ho appena usato l'indirizzo www.mysite.com invece del mio indirizzo effettivo :) –

risposta

22

Non so se stai ancora cercando una risposta, ma qui va. Dopo alcune ricerche e tentativi ed errori, ho trovato il successo con le seguenti regole. La maggior parte degli esempi che ho riscontrato sono inutilmente complessi per quanto riguarda la corrispondenza dei modelli e introducono altre variabili che impediscono alle regole di funzionare come previsto. Le regole di seguito possono essere applicati a qualsiasi sito web, e niente è hard-coded quindi dovrebbe essere sempre un lavoro di copia-e-incolla dritto:

<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> 

Due cose da notare: redirectType = "permanente" si comporterà nella regola applicata fino a quando la cronologia/la cache del browser non vengono svuotate; questo dovrebbe essere una buona cosa in quanto il browser farebbe andare avanti il ​​lavoro. Inoltre, appendQueryString = "false" è necessario in quanto la variabile del server {HTTP_URL} include già la querystring completa; di default l'opzione è "true" e risulterebbe in duplicati querystrings qui.

+0

Questa è la soluzione migliore che ho trovato. La maggior parte degli altri esempi codifica il nome di dominio, ma questo non lo è, quindi è molto più potente. –

+0

fantastico! Grazie –

5

Se è per il bene di tutti, ecco la stessa cosa ottenuto con una sola regola:

<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> 
Problemi correlati