【问题标题】:HTTPS with URL rewriting is not working on appharbor带有 URL 重写的 HTTPS 在 appharbor 上不起作用
【发布时间】:2012-07-16 18:11:09
【问题描述】:

我在 asp.net 3.5 上构建了一个应用程序,该应用程序托管在 AppHarbor 上。问题是 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);
    }
}

以及 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>

问题是该页面处于无限循环中,无法正确重定向。

【问题讨论】:

  • 您是否能够针对本地运行的代码进行调试和设置断点,以便在重定向之前测试NewUrl 的值?如果未设置 X-Forwarded-Proto ,似乎总是会发生重定向。是否始终确保设置此标头值?

标签: asp.net appharbor


【解决方案1】:

RequireHttpsAttribute:如果您使用内置的 RequireHttpsAttribute 来确保控制器操作始终使用 HTTPS,您将遇到重定向循环。 原因是 SSL 在负载均衡器级别终止,并且 RequireHttps 无法识别它用来指示请求是使用 HTTPS 发出的 X-Forwarded-Proto 标头。

“肉”以粗体显示。

请参阅:AppHarbor SSL FAQ - 特别是疑难解答部分。

如果您的网络服务器前面有 SSL 集中器或类似设备,也会出现同样的问题。这在“云托管”环境中很常见....

第……

【讨论】:

  • SSL 在我们的应用程序中运行良好,无需 URL 重写,但是当我们应用上述 url 重写规则时,应用程序进入无限循环,浏览器检测到页面未正确重定向..这是主要问题
【解决方案2】:

就像 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

你重写规则依赖于协议/方案是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 Express 进行单元测试和本地浏览器测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 2013-12-16
    • 2012-10-09
    相关资源
    最近更新 更多