从https页面链接

时间:2009-09-09 11:45:56

标签: c# .net html ssl

这听起来应该是一个常见问题,但我可以找到很少的解决方案。

基本上,https页面上的相对链接(通常在控件和母版页中找到)显然会链接到非安全页面,这是不可取的。

一种可能的解决方案是使用页面头部的基本标记将所有相对pats根到http,但是安全页面中的任何相关资源都将根植于http,这也是不合需要的。

我考虑过覆盖渲染方法,如果是安全页面,则将页面上的所有相关链接重写为http。

应该怎么做?

5 个答案:

答案 0 :(得分:1)

请记住存在与协议无关的绝对URL(例如//example.com/images/artwork.jpg)。这样的URL将是https URL IFF,当前基页是https页面。

答案 1 :(得分:0)

你的意思是所有绝对网址?答案是你不要使用绝对网址。您使用相对的(/foo代替http://example.org/foo)。

答案 2 :(得分:0)

一种方法是实施例如一个IHttpModule检查传入的请求,从URL决定它们是否应该在http:https:,如果请求使用“错误”协议,则发出重定向以使用“正确的”协议。

更新:我找到了another question,其中的答案提供了有关此方法的优缺点的更多详细信息。这是来自该主题的interesting link

答案 3 :(得分:0)

我倾向于覆盖System.Web.UI.Page类并添加IsSecure属性。然后,您可以在Page指令中设置它:

<%@ Page Language="C#" MasterPageFile="~/Default.Master" AutoEventWireup="true" 
CodeBehind="Foo.aspx.cs" Inherits="Bar.Foo" IsSecure="true" %>

在您自己的页面类中,您可以使用以下内容覆盖OnPreInit进行重定向:

if (IsSecure && Request.Url.Scheme == "http")
{
    string targetUrl = String.Format(
                           "https://{0}{1}",
                           Request.Url.Host,
                           Request.RawUrl);
    Response.Redirect(targetUrl);
}
else if (!IsSecure && Request.Url.Scheme == "https")
{
    string targetUrl = String.Format(
                           "http://{0}{1}", 
                           Request.Url.Host, 
                           Request.RawUrl);
    Response.Redirect(targetUrl);
}

您的所有页面都需要从您自己的页面类继承,而不是继承System.Web.UI中的页面,但是一旦这样排序,您就可以继续了。

P.S。所有这些代码都是来自内存,所以可能是片状的(我永远不会记得应用程序目录是否包含在RawUrl中),但概念就在那里。

答案 4 :(得分:0)

好的我已经实现了一个解决方案,如果在ssl页面上通过覆盖render方法重写相对链接。我认为从ssl重定向是不好的形式,但我也认为在不发布用户信息的页面上使用ssl是不好的形式。

我仍然会听到别人如何处理这个问题。

无论如何,这是我的解决方案。我使用HtmlAgilityPack解析html,但如果你愿意,可以使用正则表达式。

protected override void Render(System.Web.UI.HtmlTextWriter writer)
    {
        if (HttpContext.Current.Request.Url.Scheme == "https")
        {
            StringBuilder stringBuilder = new StringBuilder();
            HtmlTextWriter pageTextWriter = new HtmlTextWriter(new StringWriter(stringBuilder, System.Globalization.CultureInfo.InvariantCulture));
            base.Render(pageTextWriter);

            HtmlAgilityPack.HtmlDocument htmldoc = new HtmlAgilityPackHtmlDocument();
            htmldoc.LoadHtml(stringBuilder.ToString());
            HtmlAgilityPack.HtmlNodeCollection linkNodes = htmldoc.DocumentNode.SelectNodes("//a[@href]");
            if (linkNodes != null)
            {
                Uri baseUri = new Uri("http://www.mynonsslwebroot.co.uk/");
                foreach (HtmlAgilityPack.HtmlNode node in linkNodes)
                {
                    Uri uri;

                    if (Uri.TryCreate(baseUri, node.Attributes["href"].Value, out uri))
                    {
                        node.Attributes["href"].Value = uri.OriginalString;
                    }
                }
                writer.Write(htmldoc.DocumentNode.WriteTo());
            }
        }
        else
        {
            base.Render(writer);
        }
    }