只有在将代码部署到生产环境时,才会获得无限重定向循环。我试图通过使用简单的代码重定向强制页面上的SSL。我正在使用一个精简的旧学校网页表格(我在这个项目上坚持使用.NET 3.5)。所有代码如下。 关于为什么我会在生产中获得无限重定向外观而不是测试的任何想法? 关于测试与生产的说明:
ASPX标记:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SecurePage.aspx.cs" Inherits="wwwroot.SecurePage" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
This page is secure!
</div>
</form>
</body>
</html>
代码隐藏:
namespace wwwroot
{
public partial class SecurePage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Request.Url.ToString().ToLower().StartsWith("https://"))
Response.Redirect(Request.Url.ToString().ToLower().Replace("http://", "https://"));
}
}
}
答案 0 :(得分:1)
如果您有负载均衡器(例如IIS ARR
),我会怀疑您的应用可能正在从中接收http
。您的代码类似于支票Request.IsSecureConnection
,在这种情况下始终 false ,从而导致无限循环。基本上是客户 - &gt;负载均衡器为https
,然后来自负载均衡器 - &gt;网络农场它是http
...等式中有一个负载平衡器。我最初尝试过Request.IsSecureConnection并获得无限重定向...我可以使用https方案点击静态资源,没有问题,CSS文件,JS文件,图像等。
您的负载均衡器通常(希望)有一个表示此类的标头。您应该在IIS级别使用rewrite rule - 处理它,然后才能访问ASP.net管道(这就是为什么/静态资源是&#34;未受影响&#34;)。您还必须删除检查它的代码(不要在ASP.Net级别检查和重定向)。
以下是我为特定提供商使用的示例(显然您必须与提供商联系):
<rule name="Redirect to HTTPS" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_CLUSTER_HTTPS}" pattern="^on$" negate="true" />
<add input="{HTTP_CLUSTER_HTTPS}" pattern=".+" negate="true" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}{SCRIPT_NAME}/{REQUEST_URI}" redirectType="SeeOther" />
</rule>
... H个