什么是全站HTTPS
全站HTTPS就是指整個網站的所有頁面,所有資源全部使用HTTPS鏈接。
當用戶的某個請求是明文的HTTP時,應該通過HTTP狀態碼301永久重定向到對應的HTTPS鏈接。
為了實現全站HTTPS,可以從下面兩種方法中選取一種。
修改Global.asax.cs
在Global.asax.cs
添加如下代碼
#if !DEBUG
GlobalFilters.Filters.Add(new RequireHttpsAttribute());
#endif
這是配置了ASP.NET的程序,可以處理所有的經過ASP.NET處理的請求;但是對於存放在Web服務器上的其他資源文件(即不經過ASP.NET的程序的處理)無效。
如果有此需求,應該告知IIS服務器不要私自回復用戶請求,要求所有請求都必須由ASP.NET程序執行。
此時,在Web.config
下增加下面的內容,注意是根目錄的Web.config而不是Views文件夾的Web.config
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<system.webServer>
[QIN.WARNING] 所有的請求都會發送給ASP.NET處理,此時應確保程序有能力處理原來屬於IIS負責的那部分內容,比如圖片。
修改Web.config部署全站HTTPS
插一句題外話,下個版本的ASP.NET據說要取消掉Web.config。
在IIS 7.0+的版本上,可以使用URL Rename來完成。Url Rename是指當IIS接收到某個請求后,先根據設定的規則進行更改請求地址后,在發送給網站程序。經測試本方法在Azure App Service (原名 Azure Websites)是可以使用的。
在Web.config的configuration
節點下,找到或添加system.webServer
節點,並在此節點下添加:
<rewrite>
<rules>
<!-- clear 會清除掉已有的rule,如果添加過別的rule,請注意確認-->
<clear/>
<rule name="Force HTTPS" enabled="true">
<match url="(.*)" ignoreCase="false" />
<conditions>
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
僅修改Release的Web.config
這樣就算輕松搞定了,但是在開發時,我們不希望要求HTTPS,這時可以通過只修改Release的Web.config來解決。
首先,不要修改Web.config
,而是找到Web.Release.config
(VS點開Web.config的小箭頭)。
在configuration
節點下添加如下內容:
<system.webServer>
<rewrite xdt:Transform="Insert">
<rules>
<!-- clear 會清除掉已有的rule,如果添加過別的rule,請注意確認-->
<clear/>
<rule name="Force HTTPS" enabled="true">
<match url="(.*)" ignoreCase="false" />
<conditions>
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
這個如剛才的區別僅僅在於<rewrite xdt:Transform="Insert">
,關於如何整合這些內容,請參閱用於 Web 應用程序項目部署的 Web.config 轉換語法。