[英]HTTPS with URL rewriting is not working on appharbor
我在AppHarbor上托管的asp.net 3.5上構建了一個應用程序。 問題是在HTTPS上URL重寫不起作用。 以下是在SSL上運行某些頁面的代碼:
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);
}
}
URL的規則在web.config上重寫:
<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>
問題在於該頁面處於不確定循環中,無法正確重定向。
RequireHttpsAttribute:如果您使用內置的RequireHttpsAttribute來確保控制器操作始終使用HTTPS,則會遇到重定向循環。 原因是SSL在負載均衡器級別終止,並且RequireHttps無法識別用於指示請求是使用HTTPS進行的X-Forwarded-Proto標頭。
“肉”以粗體顯示。
請參閱: AppHarbor SSL常見問題解答 -特別是“ 疑難解答”部分。
如果您的Web服務器前有一個SSL集中器或類似的設備,則會出現同樣的問題。 在“雲托管”環境中非常普遍。
嗯...
就像提到的EdSF一樣,您遇到的問題是因為SSL(HTTP)位於負載均衡器級別。 意思是,進入ASP.NET應用程序的所有請求都是HTTP。
因此,在運行於AppHarbor的應用程序中,以下條件將始終成立:
Request : https://mysite.com/about
---------------------------------------------------------------------------------
-> Request.Url.Scheme // http
-> Request.Url.AbsoluteUri // http://mysite.com:port/about
-> Request.issecure // false
您重寫規則依賴於協議/方案為https
,而永遠不會如此,從而導致無限循環。
在AppHarbor上運行的ASP.NET應用程序中檢查HTTPS的方法如下:
string.Equals(Request.Headers["X-Forwarded-Proto"],
"https",
StringComparison.InvariantCultureIgnoreCase);
我還將Web應用程序托管在AppHarbor上,並且需要更好的解決方案,因此我創建了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 Express支持單元測試和本地瀏覽器測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.