将HTTPS页面上的URL重写为HTTP
本文关键字:URL 重写 HTTP HTTPS | 更新日期: 2023-09-27 18:23:46
使用IIS7的"bindings"功能,我在网站的根目录上将SSL证书添加到"https"(端口443)。然后,我需要一个特定目录"/secure directory/"的SSL连接。我现在可以通过显式链接到https地址重定向到此目录:https://www.mysite.com/secure-directory/.问题是/secure directory/是我唯一想使用SSL的目录,它包含的导航链接现在正在维护https前缀,所以我的"主页"链接现在指向https://www.mysite.com而不是http://www.mysite.com.
为/secure目录/中的链接保留http前缀的理想方式是什么?我有IIS7 URL重写模块,所以如果有人可以共享出站规则,那将不胜感激。否则,我想知道我是不是完全错了,或者有比重写规则更好的解决方案。谢谢
我正在使用这个模块。您可以将/secure directory/配置为仅通过https 访问
<secureWebPages>
<directories>
<add path="secure-directory" />
</directories>
</secureWebPages>
我通常使用这样的方法,它一直对我有效。(但不完全确定这是最好的方法)。
您可以在global.asax中使用类似的函数,并可以调用Application_BeginRequest
private void RedirectToCorrectSSLScheme()
{
Uri pageRequest = Request.Url;
string requestPath = pageRequest.GetLeftPart(UriPartial.Path).ToLower();
requestPath = Server.UrlDecode(requestPath);
// PageIsSecure returns if the given page should be secure or not. I
//maintain a list of secure pages or
//secure directory in an XML config.
bool securePage = GetSecurePages().PageIsSecure(requestPath);
if (pageRequest.Scheme == "https" && !securePage && requestPath.Contains(".aspx"))
{
Response.Redirect("http://" + pageRequest.Host + pageRequest.PathAndQuery, true);
}
else if (pageRequest.Scheme == "http" && securePage && requestPath.Contains(".aspx"))
{
Response.Redirect("https://" + pageRequest.Host + pageRequest.PathAndQuery, true);
}
}
这不是URL重写问题,IMO。但是,至少在理论上(POC时间?),您可以编写另一个重写规则,该规则将返回到非SSL。然而,重写场景并没有那么可扩展,因为它迫使一个人每次翻转两次。根据应用程序的正常使用情况,这可能是问题,也可能不是问题。
处理此问题的一个简单方法是覆盖菜单控件,这样您就可以尊重配置。这意味着菜单将使用其他实现的绝对链接(非SSL时为SSL的绝对链接,反之亦然)。
如果您需要更"工业实力"的东西,可以考虑在"管道"中添加一个HTTP处理程序,并在那里控制SSL或非SSL。我会彻底地了解这一点,这样你就不会最终重新发明轮子(这里没有发明综合症),并试图使其成为一个可重复使用的抽象。这有点复杂,但当你转向另一个解决方案时,重复起来可能会更简单。我会先看看是否有人开源了这样的处理程序,因为这不是一个罕见的问题。
我相信还有其他方法可以看待这个问题。
感谢您的回复。我考虑过实现global.asax和模块解决方案,但最终最符合我需求的是一个出站重写规则。我可能会在晚些时候重新审视这一点,并重新评估我的情况,但就目前而言,这就是我正在使用的(1860年的港口被拆除用于生产):
<rule name="ForceHttpsToHttp" preCondition="ResponseIsHtml1">
<match filterByTags="A, Img" pattern="^(?!.*javascript).*$" />
<conditions>
<add input="{HTTPS}" pattern="ON" />
<add input="{SERVER_PORT}" pattern="443" />
</conditions>
<action type="Rewrite" value="http://{HTTP_HOST}:1860{R:0}" />
</rule>
(该模式防止对服务器端点击事件进行重写,而(.*)会重写并破坏它们)