2017-03-01 14 views
2

我有asp.net自定義錯誤,他們正在工作的偉大:需要SSL,但仍保持asp.net自定義錯誤

<customErrors mode="RemoteOnly" defaultRedirect="~/Error/Index/500"> 
    <error statusCode="403" redirect="~/Error/Index/403" /> 
    <error statusCode="404" redirect="~/Error/Index/404" /> 
    <error statusCode="500" redirect="~/Error/Index/500" /> 
    <error statusCode="502" redirect="~/Error/Index/502" /> 
    <error statusCode="503" redirect="~/Error/Index/503" /> 
    <error statusCode="504" redirect="~/Error/Index/504" /> 
</customErrors> 

此外,SSL證書已成功安裝和我的網站被訪問的就好了http和https。

問題出現時,我得到了要求SSL的要求。該網站的http鏈接已經分發給1000個用戶。所以我們需要任何流向http地址的流量都被正常地重定向到https主頁。

我試圖讓重定向工作的任何解決方案都會打破自定義錯誤。

我有這個測試網址,生成一個錯誤,以測試我的自定義錯誤頁面〜/錯誤/測試。它使用mvc佈局顯示我的自定義錯誤頁面。

無論我如何設置它,當我在IIS的SSL設置中打開Require SSL時,如果打開任何http自定義錯誤(以便啓用403.4重定向),它甚至不會嘗試顯示我的自定義500頁面。它顯示了通用的http 500頁面。

我希望403.4處理在http級別的重定向和500在我的自定義錯誤頁面處理在asp.net級別。順便說一句,它不是一個頁面,而是一個使用會話變量中的.net異常的控制器。

我該如何做到這一點?

+0

你「打開需要ssl」嗎?通常這是爲了cookies等。您需要執行UrlRewrite來強制請求到HTTPS,並且需要在服務器上安裝UrlRewrite模塊。 –

+1

@BenDuguid - 不,你需要*重定向*而不是*重寫*。當然,UrlRewrite模塊可以做到這一點。 – NightOwl888

+1

還有'RequireHttps'屬性(您可以註冊爲全局過濾器)以及通過IIS禁用HTTP的功能。所以,有很多可能的方法可以讓你「需要HTTPS」 - 我們需要知道你嘗試過哪一種。 – NightOwl888

回答

0

此問題似乎是IIS「需要SSL」功能與現有鏈接之間的斷開 - IIS中的所有操作都會導致它拒絕通過HTTP發出的請求,但它不會執行任何重定向。

403.4是一個custom IIS sub-status code,意思是「需要SSL」 - 如果您請求的網站沒有SSL,您會得到該錯誤 - 即它阻止了所有未在HTTPS下發出的請求。

發出的實際響應是一個標準的403-禁止的,沒有涉及重定向,也沒有任何告訴瀏覽器它應該通過SSL請求站點 - 這些都在返回的HTML中,並且希望能夠被用戶。在請求傳遞給應用程序進行處理之前,錯誤是由IIS發出的,這就是爲什麼你沒有看到你的任何自定義錯誤 - 無論哪種方式,如果你看到你的錯誤頁面,它仍然是403頁面。

因此,如果您需要支持HTTP下的初始請求,您將需要設置某種形式的重定向。

有幾個方法可以做到這一點:

使用UrlRewrite模塊 - 但請注意,這可能是一個單獨依賴你的託管服務器上安裝。一旦這樣安裝,你可以這樣做:

<system.webServer> 
    <rewrite> 
     <rules> 
      <rule name="RequireSsl" stopProcessing="true"> 
       <match url="(.*)" /> 
       <conditions> 
        <add input="{HTTPS}" pattern="ON" negate="true" /> 
       </conditions> 
       <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" /> 
      </rule> 
     </rules> 
    </rewrite> 
</system.webServer> 

這將確保所有對服務器的請求(靜態文件以及MVC路線)將被重定向到SSL。

另一種選擇是[RequireHttps]過濾器屬性,可以將其添加到控制器,操作或全局過濾器集合中,但這大多隻會影響MVC路由 - 靜態文件仍可以在沒有HTTPS的情況下提供。

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    [...] 
    // Add RequireHttps to any existing filters to force all routes to SSL 
    filters.Add(new RequireHttpsAttribute()); 
} 

注意,這兩個只會導致客戶端上的一個GET請求執行重定向,大多數客戶會忽略301/302 POST請求因爲你不應該重新提交表單。

[RequireHttps]選項只會發出GET請求的重定向,POST請求將返回一個無效的動作異常:「必須使用HTTPS」。

+0

下面是重寫模塊的鏈接:包括下載鏈接。 https://www.iis.net/learn/extensions/url-rewrite-module/using-the-url-rewrite-module。它在'HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ IIS Extensions \ URL Rewrite'上被檢測到。 – toddmo

+0

好奇,我自己嘗試過濾器選項,因爲我不確定它是否正確地重定向GET請求 –

+0

好的。在本地或在測試環境中調試時使用過濾器時,我得到了'ERR_CONNECTION_REFUSED'。我會尋找這個問題。謝謝。聽起來像完美的解決方案,如果我能得到它的工作。 – toddmo