同一站点仅通过蜂窝网络而非 WiFi 生成 "too many redirects"
The same site produces "too many redirects" only via cellular, not via WiFi
我在外部主机提供商处托管了一个小型网站。当我从我的 iPhone 打开它时,我得到不同的结果,具体取决于我的 iPhone 连接到互联网的方式:
- 当通过 WiFi 建立连接时,我的页面总是按预期打开和运行
- 当通过 Cellular 建立连接时,我的页面总是产生以下错误信息:
在移动版 Safari 上:
Safari cannot open the page because too many redirects occurred.
在手机上 Chrome:
This page isn't working / redirected you too many times.
在移动 Opera 上:
This site can't be reached / too many HTTP redirects.
据我所知,决定结果的唯一区别是互联网连接类型 - WiFi 与蜂窝网络。我找不到任何其他差异。
由于网站通过 WiFi 网络运行良好,我排除了网站上的重定向循环(这是导致 "too many redirects" 错误的最常见原因)。我也尝试关闭跨站点跟踪预防,但结果还是一样。我错过了什么吗?这种奇怪行为的原因可能是什么?
如果相关,这里有一些关于网站本身的事情:
- 网站是用ASP.NET核心开发的
- 我在两种情况下(通过 WiFi 和通过蜂窝网络)都使用 https 访问网站
- 站点位于子域上,该子域使用来自 "top" 域的通配符证书
- 站点使用 ASP.NET 核心 "scaffold-ed" 身份验证,它使用重定向和 cookie,并具有 "remember me" 功能。
尝试将以下行添加到您的 Web.Config 文件中。
似乎这可能与移动网络在将数据包发送回设备时尝试压缩数据包的方式有关。
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Cache-Control" value="no-transform" />
</customHeaders>
</httpProtocol>
</system.webServer>
我认为这相当于添加
Header set Cache-Control "no-transform"
到您的 .htaccess 文件。
如果这不起作用,请尝试将以下内容添加到请求期间通常应该触及的所有页面。
<% @Language="VBScript" %>
<% Response.CacheControl = "no-transform" %>
注意:此代码必须插入页面的开头,除非启用缓冲,因为它正在修改 HTTP headers。
It might be caused by browsers not getting correct content-type
Can you add this to your head in the view or layout(if you are using)
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
我终于偶然发现了一个修复程序,尽管我仍然不知道为什么错误没有在桌面和移动 WiFi 连接上显示出来。该问题与使用进程外模式在 IIS 上托管我的 Web 应用程序有关,并在设置期间调用 UseHttpsRedirection()
。
接下来发生的是 described in this answer:通过 http 连接到我的进程外主机 (Kestrel) 的 IIS 被重定向,我的 phone 上的浏览器以某种方式检测到它。还有第二个重定向(合法的)到登录页面,phone 浏览器也计算在内。现在 phone 浏览器看到两个重定向,所以它显示错误,因为最多允许一个重定向。
修复只是删除对 UseHttpsRedirection()
的调用。在进程外托管场景中没有必要:IIS 前端配置为需要 https,因此客户端无论如何都会被重定向。
我认为您的服务提供商正在使用 apache 服务器。
如果是,请重置 .htacess 文件(它是用于控制服务器设置(包括重定向)的服务器配置文件)。
在反向代理后面执行应用程序端 https 强制操作很棘手。通常最好让反向代理执行强制,并将代理设置为仅在 https 上通信以避免任何应用程序端强制。 (当然,如果应用程序具有 https 功能)
如果您必须从应用程序执行此操作,则代理必须包含应用程序评估原始连接上下文所必需的 headers。如果您重写它,它可能必须知道原始主机名和基本路径。
请查看 asp.net 核心转发 Headers 中间件的说明。
https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer
至于为什么它会根据您的互联网连接类型而有所不同,这有点神秘。
我在外部主机提供商处托管了一个小型网站。当我从我的 iPhone 打开它时,我得到不同的结果,具体取决于我的 iPhone 连接到互联网的方式:
- 当通过 WiFi 建立连接时,我的页面总是按预期打开和运行
- 当通过 Cellular 建立连接时,我的页面总是产生以下错误信息:
在移动版 Safari 上:
Safari cannot open the page because too many redirects occurred.
在手机上 Chrome:
This page isn't working / redirected you too many times.
在移动 Opera 上:
This site can't be reached / too many HTTP redirects.
据我所知,决定结果的唯一区别是互联网连接类型 - WiFi 与蜂窝网络。我找不到任何其他差异。
由于网站通过 WiFi 网络运行良好,我排除了网站上的重定向循环(这是导致 "too many redirects" 错误的最常见原因)。我也尝试关闭跨站点跟踪预防,但结果还是一样。我错过了什么吗?这种奇怪行为的原因可能是什么?
如果相关,这里有一些关于网站本身的事情:
- 网站是用ASP.NET核心开发的
- 我在两种情况下(通过 WiFi 和通过蜂窝网络)都使用 https 访问网站
- 站点位于子域上,该子域使用来自 "top" 域的通配符证书
- 站点使用 ASP.NET 核心 "scaffold-ed" 身份验证,它使用重定向和 cookie,并具有 "remember me" 功能。
尝试将以下行添加到您的 Web.Config 文件中。 似乎这可能与移动网络在将数据包发送回设备时尝试压缩数据包的方式有关。
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Cache-Control" value="no-transform" />
</customHeaders>
</httpProtocol>
</system.webServer>
我认为这相当于添加
Header set Cache-Control "no-transform"
到您的 .htaccess 文件。
如果这不起作用,请尝试将以下内容添加到请求期间通常应该触及的所有页面。
<% @Language="VBScript" %>
<% Response.CacheControl = "no-transform" %>
注意:此代码必须插入页面的开头,除非启用缓冲,因为它正在修改 HTTP headers。
It might be caused by browsers not getting correct content-type
Can you add this to your head in the view or layout(if you are using)
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
我终于偶然发现了一个修复程序,尽管我仍然不知道为什么错误没有在桌面和移动 WiFi 连接上显示出来。该问题与使用进程外模式在 IIS 上托管我的 Web 应用程序有关,并在设置期间调用 UseHttpsRedirection()
。
接下来发生的是 described in this answer:通过 http 连接到我的进程外主机 (Kestrel) 的 IIS 被重定向,我的 phone 上的浏览器以某种方式检测到它。还有第二个重定向(合法的)到登录页面,phone 浏览器也计算在内。现在 phone 浏览器看到两个重定向,所以它显示错误,因为最多允许一个重定向。
修复只是删除对 UseHttpsRedirection()
的调用。在进程外托管场景中没有必要:IIS 前端配置为需要 https,因此客户端无论如何都会被重定向。
我认为您的服务提供商正在使用 apache 服务器。 如果是,请重置 .htacess 文件(它是用于控制服务器设置(包括重定向)的服务器配置文件)。
在反向代理后面执行应用程序端 https 强制操作很棘手。通常最好让反向代理执行强制,并将代理设置为仅在 https 上通信以避免任何应用程序端强制。 (当然,如果应用程序具有 https 功能)
如果您必须从应用程序执行此操作,则代理必须包含应用程序评估原始连接上下文所必需的 headers。如果您重写它,它可能必须知道原始主机名和基本路径。
请查看 asp.net 核心转发 Headers 中间件的说明。 https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer
至于为什么它会根据您的互联网连接类型而有所不同,这有点神秘。