【问题标题】:HTTP to HTTPS Browser issueHTTP 到 HTTPS 浏览器问题
【发布时间】:2017-06-19 18:58:13
【问题描述】:

我这几天一直在搜索这个问题,做了很多研究,但我就是想不通。

我正在尝试控制我的页面以将它们重定向到 http 或 https,无论我需要与否。

我创建了一个属性放在我需要在 HTTPS 中运行的每个页面上方

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

然后我运行一个 HttpModule 来检查请求的每个页面。

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。但我不能在我有 test.dartsghent.be 的子网站上使用它

谁能告诉我如何解决这个问题,请不要使用 urlrewriter 模块。

感谢任何帮助

注意:我没有使用 MVC

这是 Chrome 输出的示例。

如您所见,页面不断地自行重定向。我正在使用 RedirectPermanent(url) 到 https,但即使重定向被触发,它也不会移动到 https,所以它一直在尝试。

【问题讨论】:

  • “浏览器拒绝切换”是什么意思?您是否看到响应中设置了正确的重定向标头(使用您的浏览器开发工具)?究竟是什么意外的浏览器行为?
  • 在 Chrome 中我得到了以下行为 dartsghent.be --> wwww.dartsghent.be = 成功 dartsghent.be --> dartsghent.be = 页面将保留在 http 协议上
  • 我测试的越多,我就越认为问题出在重定向上。即使我清楚地告诉我的重定向转到 https 链接。看起来重定向正在将我的重定向本身移动到与当前相同的协议,只要域相同。有什么解决方案吗?
  • 您是否使用 SSL 卸载或任何类型的负载平衡器?

标签: c# asp.net https response.redirect ihttpmodule


【解决方案1】:

假设这是 ASP.NET MVC...

此功能已通过 System.Web.Mvc.RequireHttpsAttribute 类存在于 MVC v4 中。

【讨论】:

  • 是的。我没有使用 MVC。
  • 那么您真的需要提前向我们提供这些信息。
  • 我对我的帖子进行了编辑。以为我们不会去那里,因为我没有标记 MVC
  • 告诉我们你没有使用什么并不是非常有用。在您的问题中添加标签以表明您正在使用的技术怎么样?
【解决方案2】:

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

如果你想使用子域你需要询问原始请求:

string url = requireSSL ? Uri.UriSchemeHttps : Uri.UriSchemeHttp +
             request.Host +
             request.AbsolutePath +
             request.Query;

这不是我的想法。检查生成的字符串并进行相应调整。

【讨论】:

  • 我的例子是从网上的另一个 guid 那里得到的,只改编了一点。您的解决方案仍然无法解决我在 http 和 https 之间切换的问题
【解决方案3】:

我做了更多研究,发现问题出在我的重定向功能上。 当您重定向到同一个域时,它不会更改协议。所以我所做的是检查域名是否为www。是否在前面,然后重定向到带有 www 的域。前面没有。

如果是子域,这会更难,所以我必须先重定向到另一个页面。否则浏览器会陷入循环。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 2011-08-14
    • 2020-11-17
    • 2011-03-13
    相关资源
    最近更新 更多