2012-07-16 48 views
2

我在AppHarbor上託管的asp.net 3.5上構建了一個應用程序。問題是在HTTPS URL重寫不起作用。以下是運行一些對SSL頁面的代碼:帶URL重寫的HTTPS在appharbor上不起作用

string CurrentUrl = Request.Url.ToString(); 
string sPath = System.Web.HttpContext.Current.Request.Url.AbsolutePath;  
System.IO.FileInfo oInfo = new System.IO.FileInfo(sPath); 
string sRet = oInfo.Name;  
string sDir = oInfo.Directory.Name;  
pageName = sRet; 
if (sRet == "Register.aspx" || sRet == "Login.aspx" || sRet == "Post.aspx" || sRet == "ChangePassword.aspx" || sRet == "ChangeUserStatus.aspx" || sRet == "Verification.aspx" || sRet == "ContactInfo.aspx" || sRet == "Find.aspx" || sRet == "MyAccount.aspx" || sRet == "MyEmailAddresses.aspx" || sRet == "Load.aspx" || sRet == "MyPostedLoads.aspx" || sRet == "MySubmittedBids.aspx" || sRet == "MySavedAddresses.aspx" || sRet == "MyCarriers.aspx" || sRet == "MyPotentialLoads.aspx" || sRet == "MyFreightAlarms.aspx" || sRet == "MyFreightAlarmsPreferences.aspx" || sRet == "MyAddress.aspx" || sRet == "GetUserComments.aspx" || sRet == "MyCreditCard.aspx" || sRet == "MyWallet.aspx" || sRet == "InvoiceMe.aspx" || sRet == "MyShippers.aspx" || sRet == "MyCoWorkers.aspx" || sRet == "MyACH.aspx" || sRet == "RouteMap.aspx" || sRet == "Pricing.aspx" || sRet == "PricingPayment.aspx" || sRet == "PaymentProcessed.aspx") 
{ 
    string NewUrl = ""; 

    if (!Request.IsSecureConnection && !string.Equals(HttpContext.Current.Request.Headers["X-Forwarded-Proto"], "https", StringComparison.OrdinalIgnoreCase)) 
    { 
     NewUrl = Regex.Replace(CurrentUrl, 
           @"^https?(://[^/:]*)(:\d*)?", 
           "https$1", 
           RegexOptions.IgnoreCase); 

     Response.Redirect(NewUrl); 
    } 
} 

而且在web.config中的URL重寫規則:

<rewrite> 
    <rules> 
    <rule name="Rewrite with .aspx" stopProcessing="true"> 
     <match url="^([^\.]+)$" /> 
     <action type="Rewrite" url="{R:1}.aspx" /> 
    </rule> 
    <rule name="Redirect .aspx page requests" stopProcessing="true"> 
     <match url="(.+)\.aspx" /> 
     <action type="Redirect" url="{R:1}" /> 
    </rule> 
    </rules> 
</rewrite> 

的問題是該網頁保留在無限循環並且無法正確重定向。

+0

您是否能夠針對本地運行的代碼調試和設置斷點,以在重定向之前測試NewUrl的值?它也看起來像重定向總是會發生,如果沒有設置「X-Forwarded-Proto」。這個標題值是否始終保證被設置? – 2012-07-16 20:44:00

回答

0

RequireHttpsAttribute:如果您使用內置的RequireHttpsAttribute來確保控制器操作始終使用HTTPS,您將會遇到重定向循環。 原因是SSL在負載平衡器級別處終止,RequireHttps無法識別它用於指示請求是使用HTTPS製作的X-Forwarded-Proto標頭。

「肉」以粗體顯示。

請參閱:AppHarbor SSL FAQ - 特別是疑難解答部分。

如果您在Web服務器前安裝了SSL集中器或類似設備,則會出現同樣的問題。這是相當常見的「雲主機」環境....

H個....

+0

SSL在我們的應用程序中工作正常,沒有Url重寫,但是當我們應用上面的url重寫規則時,應用程序進入無限循環,瀏覽器檢測到頁面沒有正確重定向。這是主要問題 – user1529681 2012-07-16 22:37:57

0

像EDSF提到的,你所遇到的問題是,因爲SSL(HTTPS)是在負載均衡的水平。意思是,所有進入你的ASP.NET應用程序的請求都是HTTP。

所以在AppHarbor運行應用程序,以下將永遠是正確的:

Request : https://mysite.com/about 
--------------------------------------------------------------------------------- 
-> Request.Url.Scheme // http 
-> Request.Url.AbsoluteUri // http://mysite.com:port/about 
-> Request.issecure // false 

你重寫規則都是靠protocal /方案是https,它永遠不會是,導致一個無限循環。

檢查在AppHarbor運行ASP.NET應用程序的HTTPS會是以下方式:

string.Equals(Request.Headers["X-Forwarded-Proto"], 
       "https", 
       StringComparison.InvariantCultureIgnoreCase); 

我還主辦AppHarbor我的web應用程序,需要一個更好的解決方案,所以我創建了SecurePages項目(NuGet-GitHub)。該項目允許您使用字符串文字和正則表達式來配​​置安全/ https URL。它也強制所有其他URL使用HTTP。您還可以註冊充當HTTP請求匹配規則的自定義謂詞代表。所以,你可以註冊一個AppHarbor檢查標題:

//Secure a page  
secureUrls.AddUrl("/Register.aspx"); 

//Secure any page under /cart/* 
secureUrls.AddRegex(@"(.*)cart", RegexOptions.IgnoreCase); 

//Register a custom HTTPs match rule for AppHarbor 
SecurePagesConfiguration.RegisterCustomMatchRule(
       c => string.Equals(c.Request.Headers["X-Forwarded-Proto"], "https", StringComparison.InvariantCultureIgnoreCase)); 

安全網頁還支持單元測試,並與IIS快遞本地瀏覽器的測試。