iis-7 - type - url rewrite iis tutorial




Riscrittura URL IIS7: Come non abbandonare il protocollo HTTPS dall'URL riscritto? (3)

Sto lavorando a un sito Web che utilizza la funzione di riscrittura degli URL di IIS 7 per eseguire un reindirizzamento permanente da example.com a www.example.com, così come riscrive da nomi di dominio simili a quello "principale", ad esempio da www. examples.com per www.example.com.

Questa regola di riscrittura - mostrata sotto - ha funzionato bene per qualche tempo. Tuttavia, di recente abbiamo aggiunto il supporto HTTPS e abbiamo notato che se gli utenti visitano uno degli URL da riscrivere su www.example.com, HTTPS viene eliminato. Ad esempio, se un utente visita https://example.com viene reindirizzato a http://www.example.com , mentre vorremmo che fossero inviati a https://www.example.com .

Ecco la regola di riscrittura di interesse (in 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>

Come puoi vedere, l'attributo url dell'elemento azione punta direttamente a http: //, quindi capisco perché https://example.com viene reindirizzato su http://www.example.com . La mia domanda è, come posso risolvere questo? Ho provato (ingenuamente) a rilasciare la parte http: // dall'attributo url, ma non ha funzionato.


Ecco la risposta di Scott con i miglioramenti di Hasan. Questo dovrebbe riguardare siti misti SSL / non SSL. In pratica, la regola dice "se l'URL non ha www.example.com", esegui un reindirizzamento permanente su di esso. In sostanza ... stai reindirizzando le persone che ti visitano senza www o direttamente al tuo indirizzo 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>

Ecco una soluzione interdominio che funziona non solo su example.com ma anche su qualsiasi 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>

Se desideri semplicemente reindirizzare in base al protocollo attualmente utilizzato (come nel tuo ultimo campione), allora c'è una soluzione molto più semplice che dimezza la quantità di regole che ti serviranno. Quello che segue è quello che ho imparato da un mio collega.

Come hai visto, l'argomento {HTTPS} conterrà il valore ON o OFF. È possibile associare questo valore a https: // o http: // inserendo questo valore in una rewritemap.

Ecco come potrebbe funzionare:

1- Creare una sezione riscrittura per il mapping del valore di {HTTPS}:

    <rewriteMap name="MapProtocol" defaultValue="OFF">
      <add key="ON" value="https://" />
      <add key="OFF" value="http://" />
    </rewriteMap>

Spetta a te decidere se vuoi includere solo il protocollo, o anche il punto e virgola e le barre. Non ha importanza per la soluzione, ma tienilo a mente ovunque ti riferisca ad essa.

2- Fai riferimento a questa mappa ovunque ti serva. In questo esempio è utilizzato nelle regole in uscita, ma funzionerà anche nel tuo scenario:

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

Questo è quanto, il modulo Riscrivi URL ora dovrebbe utilizzare automaticamente il protocollo corretto per i tuoi collegamenti a seconda che tu stia utilizzando https o, ovviamente, http.

Spero che questo ti aiuti!





url-rewriting