在asp.net中Https到Http重定向

时间:2013-12-27 14:48:08

标签: c# asp.net http web https

我们有一个网站,有些网页正在使用https,这些网页保存在magic文件夹中。

https启用和端口号在web.config中为站点配置。

但是,如果用户尝试使用http访问魔术文件夹内容,我们需要重定向回 https ,反之亦然

案例1: http to https工作

http://mysite/magic-lookhttps://mysite/magic-look

在这里,我们使用了

<urlMappings>
  <add url="~/magic-look" mappedUrl="~/magic/look.aspx"/>
  <add url="~/help" mappedUrl="~/Help/default.aspx"/>

在Global.asax

protected void Application_BeginRequest(object sender, EventArgs e)
{

    string url = HttpContext.Current.Request.Url.AbsoluteUri;
    var secPort = String.IsNullOrEmpty(ConfigurationManager.AppSettings["securePort"]) ? 0 : Convert.ToInt32(ConfigurationManager.AppSettings["securePort"]);
    var secProtocolEnabled = String.IsNullOrEmpty(ConfigurationManager.AppSettings["useSecure"]) ? false : true;

    bool isSecureUrl = (url.IndexOf("/magic/", StringComparison.OrdinalIgnoreCase) >= 0) ? true : false;

    if (url.IndexOf(".aspx", StringComparison.OrdinalIgnoreCase) >= 0)
    {
        url = url.Replace(":" + secPort, "");

        if (isSecureUrl && secProtocolEnabled)
        {

            if (HttpContext.Current.Request.Url.Port != secPort)
            {
                //change .aspx page back to original SEO friendly URL and redirect
                url = url.Replace(HttpContext.Current.Request.Url.AbsolutePath, HttpContext.Current.Request.RawUrl);                    
                HttpContext.Current.Response.Redirect(Regex.Replace(url, "http", "https", RegexOptions.IgnoreCase));
            }
        }
        else
        {


            if (HttpContext.Current.Request.Url.Port == secPort && !isSecureUrl)
            {
                //cause infinite loop
               url = url.Replace(HttpContext.Current.Request.Url.AbsolutePath, HttpContext.Current.Request.RawUrl); 
               var targetUrl = Regex.Replace(url, "https", "http", RegexOptions.IgnoreCase);                   
               HttpContext.Current.Response.Redirect(targetUrl);                        
            }                
        }            
    }
}

使用Https访问非https页面,无效,无限循环

问题 不适用于https to http

https://mysite/helphttp://mysite/help

它提供infinite loop.. keep redirecting to *https://mysite/help*

https://mysite/help --> 302 Found
https://mysite/Help --> 302 Found 
https://mysite/Help --> 302 Found 
https://mysite/Help --> 302 Found .............

更新

如果删除它,它可以正常工作。

  url = url.Replace(HttpContext.Current.Request.Url.AbsolutePath, 
         HttpContext.Current.Request.RawUrl);

但是3个请求而不是2个

https://mysite/help --> 302 Found
https://mysite/Help/Default.aspx--> 302 Found 
http://mysite/Help/Default.aspx--> 200 OK

但我想要像http://mysite/Help/

这样的SEO友好网址

更新2:根本原因:

每当网址为https://../something且重定向到http://../something时,始终会发出请求https://../something

2 个答案:

答案 0 :(得分:2)

我只是重新考虑了你的代码并使用了string.Format方法来构建url

private static string GetMyUrl(string securePort, string useSecure, Uri uri)
{
    int secPort;
    if (!int.TryParse(securePort, out secPort)) secPort = 0;
    bool secProtocolEnabled = !string.IsNullOrWhiteSpace(useSecure);

    bool shouldBeSecureUrl = uri.AbsolutePath.Contains("/magic/");

    if (!uri.AbsolutePath.EndsWith(".aspx")) return uri.AbsoluteUri;

    bool forceSecure = (shouldBeSecureUrl && secProtocolEnabled);
    string url = string.Format("{0}://{1}{2}{3}",
        forceSecure
            ? "https"
            : "http",
        uri.Host,
        forceSecure && secPort != 0
            ? string.Format(":{0}", secPort)
            : string.Empty,
        uri.PathAndQuery);
    return url;
}

protected void Application_BeginRequest(object sender, EventArgs e)
{
    string url = GetMyUrl(ConfigurationManager.AppSettings["securePort"],
        ConfigurationManager.AppSettings["useSecure"], HttpContext.Current.Request.Url);
    if (HttpContext.Current.Request.Url.AbsoluteUri != url) HttpContext.Current.Response.Redirect(url);
}

您可以测试您的地址。样品...

Console.WriteLine(GetMyUrl("8484","t", new Uri("https://www.contoso.com/catalog/shownew.aspx?date=today")));
Console.WriteLine(GetMyUrl("8484","t", new Uri("https://www.contoso.com:8484/magic/shownew.aspx?date=today")));
Console.WriteLine(GetMyUrl("8484","t", new Uri("http://www.contoso.com:8080/magic/shownew.aspx?date=today")));
Console.WriteLine(GetMyUrl("","t", new Uri("https://www.contoso.com/catalog/shownew.aspx?date=today")));
Console.WriteLine(GetMyUrl("8484","", new Uri("https://www.contoso.com/catalog/shownew.aspx?date=today")));

答案 1 :(得分:1)

最后发现我们已经启用了url重写,所以只需添加配置条目,适用于所有场景

<configSections>
 <section name="URLRewriteConfiguration" 
   type="MyAssembly.Routing.URLRewriteConfiguration, MyAssembly.Routing, 
   Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</configSections>

<URLRewriteConfiguration>
<Routes>
  <add Pattern="/help/default.aspx" PermanentRedirect="true" Replacement="/help"/>

并删除

 url = url.Replace(HttpContext.Current.Request.Url.AbsolutePath, HttpContext.Current.Request.RawUrl);