2017-06-19 142 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之間切換 –