2013-07-18 215 views
22

我需要將非www url重定向到http url和https url。我在web.config中嘗試了以下規則。web.config將非www重定向到www

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

它完全適用於非SSL URL,但在SSL的情況下,它從重定向到https://domain.comhttp://www.domain.com

請幫我糾正我的規則。

+1

第一條規則捕獲這兩個請求的類型,第二條規則不會被處理 – Dima

回答

40

對於適用於Match AnyMatch All兩種情況的安全規則,您可以使用Rewrite Map解決方案。這是一個非常好的解決方案,唯一的缺點是需要在設置規則之前創建一個重寫映射。換句話說,如果您選擇將此作爲您處理協議的唯一方法,那麼您將是安全的。

您可以創建名爲MapProtocol的重寫映射,您可以在任何規則操作中使用{MapProtocol:{HTTPS}}作爲協議。

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

Reference

+2

該規則強制將所有鏈接重定向到https。我需要的是,如果它是http +非www它應該重定向到http + www 和https +非www應該重定向到https + www – Anand

+2

這一個完美工作。非常感謝 – Anand

+5

值得注意的是,您需要URL重寫模塊2.0([http://www.iis.net/downloads/microsoft/url-rewrite](http://www.iis.net/downloads/microsoft/url -rewrite))爲此工作。 –

1

我知道這是舊的文章,但它沒有完全回答。我結束了延長Satpals answer

首先映入規則HTTP + www和第二個捕獲非www

出於某種原因,我不能在拳規則使用MapProtocol但與直接寫入URL HTTPS工作。

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

這對我工作! –

3

其他的答案這裏是不必要的長,這是我使用規則(只是複製和粘貼):

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

同時保留HTTP這將重定向到www的版本和HTTPS協議

希望這有助於。