2017-06-19 139 views
0

我一直在寻找关于这个问题几天,并做了大量的研究,但我无法弄清楚这一点。HTTP到HTTPS浏览器问题

我想控制我的网页重定向到http或https,无论我需要或不。

我创建了一个attrubte把每一页,我需要在HTTPS

[AttributeUsage(AttributeTargets.Class)] 
public sealed class RequireSSL : Attribute { } 

运行上方。然后我有一个HTTP模块运行检查要求每一页。

public class DartsGhentPipeline : IHttpModule 
    { 
     public void Init(HttpApplication context) 
     { 
      context.PreRequestHandlerExecute += Context_PreRequestHandlerExecute; 
     } 

     private void Context_PreRequestHandlerExecute(object sender, EventArgs e) 
     { 
      HttpApplication application = (HttpApplication)sender; 
      HttpRequest request = application.Request; 
      HttpResponse response = application.Response; 
      Page page = application.Context.CurrentHandler as Page; 

      if (page == null) 
       return; 

      bool requireSSL = page.GetType().GetCustomAttributes(typeof(RequireSSL), true).Length > 0; 
      bool isSecureConnection = request.IsSecureConnection; 
      string url = string.Format("{0}://www.dartsghent.be{1}", requireSSL ? Uri.UriSchemeHttps : Uri.UriSchemeHttp, HttpContext.Current.Request.RawUrl); 

      if (requireSSL != isSecureConnection) 
       response.RedirectPermanent(url); 
     } 

     public void Dispose() { } 
    } 

这里的问题是,当我重定向到相同的网址或任何其他。浏览器拒绝从http切换到https或其他方式导致重定向循环,浏览器将阻止这种情况发生。

我发现我的网站运行完美时,我用www替换我的网址。或没有www。但我不能使用此subwebsite我有test.dartsghent.be

任何人都可以告诉我如何解决这个问题,请没有urlrewriter模块pls。

任何帮助表示赞赏

注:我没有使用MVC

这里是连接例如Chrome浏览器的输出。 enter image description here

正如你所看到的页面不断重定向本身。我使用RedirectPermanent(url)来https,但即使重定向被触发,它也不会移动到https,因此它一直在尝试。

+0

你是什么意思“浏览器拒绝切换”?你看到在响应中设置了正确的重定向头(使用浏览器开发工具)吗?究竟是什么意外的浏览器行为? –

+0

在Chrome中,我得到以下行为 http:// dartsghent。be - > https://wwww.dartsghent.be =成功 http://dartsghent.be - > https://dartsghent.be =页面将保留在http协议 –

+0

我测试的越多,越多认为问题在重定向。即使我明确告诉我的重定向到https链接。它看起来像重定向正在移动我自己重定向到相同的协议,因为它现在在只要域是相同的。任何解决方案? –

回答

0

我做了更多的研究,发现问题出在我的重定向功能。 当你重定向到相同的域,那么它不会改变协议。所以我做的是检查域如果www。是否在前面,然后通过www重定向到域。在它前面没有一个。

因为一个子域名会更难,因此我必须先重定向到另一个页面。否则浏览器会以循环结束。

对我来说似乎有点激烈,但它是我使它工作的唯一方法。

1

假设这是ASP.NET MVC ...

这个功能已经存在于通过System.Web.Mvc.RequireHttpsAttribute类MVC V4。

+0

是的。我没有使用MVC。 –

+0

然后你真的需要提前给我们提供这些信息。 –

+1

我在我的帖子上做了一个修改。认为我们不会去那里sinse我没有标记MVC –

0

您正在为url变量硬编码www.blah...

如果您想使用的子域,你需要查询的原始请求:

​​

这是从我的头顶。检查产生的字符串并相应地进行调整。

+0

我从网上的另一个guid中得到了我的例子,并且只改编了一个小问题。仍然你的解决方案不会解决我的问题在http和https之间切换 –