这听起来应该是一个常见问题,但我可以找到很少的解决方案。
基本上,https页面上的相对链接(通常在控件和母版页中找到)显然会链接到非安全页面,这是不可取的。
一种可能的解决方案是使用页面头部的基本标记将所有相对pats根到http,但是安全页面中的任何相关资源都将根植于http,这也是不合需要的。
我考虑过覆盖渲染方法,如果是安全页面,则将页面上的所有相关链接重写为http。
应该怎么做?
答案 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);
}
}