簡體   English   中英

帶有URL重寫的HTTPS無法在Appharbor上運行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM