我正在尝试将两个服务器变量作为 URL 重写条件的一部分进行比较。但首先,一些背景...
在 IIS 中,如果您请求http://www.example.com/foo
并且foo
是一个目录,则 IIS 会将 302“移动对象”重定向http://www.example.com/foo/
作为“礼貌重定向”(Source)发送到。
如果您使用 IIS+ARR 作为具有 SSL 卸载的反向代理,后端 IIS 节点接收的请求是通过 http 而不是 https。
结合这两种行为,IIS 的礼貌重定向会丢弃 SSL。礼貌重定向使用与 IIS 收到的请求(源)相同的方案,在这种情况下是 http 而不是 https。
我想创建一个出站重写规则,将传入 URL 与传出 Location 标头进行比较,并在这种情况下将其从 http 重写为 https:
{RESPONSE_STATUS}
是 302{HTTPS}
is "on"以上都是在前提条件下处理的。棘手的部分是最后一点:
下面是我到目前为止的代码。前提条件和标头重写都可以正常工作。但是,该条件会导致 500 错误(URL 重写模块错误),大概是因为我{REQUEST_URI}
在模式中使用。我尝试将条件分成两个并使用捕获组,但这也不起作用。有任何想法吗?
<rule name="Fix: Courtesy Redirect + SSL Offloading = …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将 www.contoso.com/blog/ 重写为 wordpress Azure 网站 (contosoblog.azurewebsites.net)。我已经完全配置了所有入站和出站规则,并在开发机器上本地测试了它们并且可以确认它有效——例如设置 www.contoso.com 以指向主机中的 127.0.0.1,点击 www.contoso.com/ blog/ 并可以确认它加载了 wordpress 站点。
我按照网络上的说明使用启动任务在 Azure 云服务中安装了 WebFarm Framework + ARR,并远程连接到实例,我可以看到 WFF 和 ARR 已正确安装。使用与我应用于开发环境相同的重写规则配置站点,当我点击 www.contoso.com/blog/ 时出现 404 错误。我想我得到 404 的唯一方法是如果没有发生重写,所以我点击了失败的请求跟踪并查看日志,我看到重写规则确实被命中并且 URL 正在被重写,但在中间的某个地方日志中有一个 ARR_WEBFARM_NOT_ROUTED 错误,URL 随后被重写回原始请求。
我到处搜索,ARR_WEBFARM_NOT_ROUTED 似乎只生成 1-2 页的 Google 结果,没有任何有用的信息。我有一种预感,它与云服务的配置方式有关,所以我启动了一个新的 Azure 虚拟机,配置了一个 IIS 角色并设置了 WebFarm+ARR。在该服务器上,一切正常。
有人可以指出我如何解决问题的正确方向,或者甚至可能吗?
当通过 ARR POST 一个大文件时,请求在 120 秒后超时。客户端收到错误代码502 Bad Gateway
。我已将 Web 场的“代理超时”配置为 600 秒。我还配置了Connection time-out
的Default Web Site
为600秒。ARR 服务器已重新启动。
以下来自ARR服务器上的日志文件:
2015-05-07 13:25:16 192.168.87.155 POST /Redacted/Import/RedactedImport20150507_152313.csv X-ARR-CACHE-HIT=0&X-ARR-LOG-ID=253daa4a-8372-405a-8efd-21ebbc38353f 80 - 192.168.87.198 - redacted.local 502 3 64 120436
Run Code Online (Sandbox Code Playgroud)
来自 applicationHost.config:
<webFarm name="redacted.local" enabled="true">
<server address="redacted.local" enabled="true" />
<applicationRequestRouting>
<healthCheck url="http://redacted.local/redacted.svc" liveTrafficFailureCodes="400-" />
<protocol timeout="00:10:00" />
</applicationRequestRouting>
</webFarm>
Run Code Online (Sandbox Code Playgroud)
背景:
我正在构建一个 PoC 以使用 ARR 为我们的后端服务实现负载平衡和高可用性,这些服务主要是 WCF(基本 HTTP)和 REST。
其中一个(REST)服务用于每天从批处理作业中接收大(ish)文件几次。REST 服务在文件处理完成之前不会返回(这可能需要 5 分钟),因为客户端应用程序需要知道处理何时完成(后面有更多步骤,取决于第一个步骤)。
我已经使用 IIS 重写规则和应用程序请求路由模块在 azure 云服务中设置了一个反向代理服务器(根据此处的说明。除了调用我为下载 mp4 文件而创建的端点外,一切都运行良好。这些端点当请求包含 Range 标头时,可以提供部分内容。我遇到的问题是,当我直接点击服务器时,它会正确响应 206(部分内容)和正确的字节范围,但有时当我点击端点通过代理服务器,它以 200 和完整的文件内容响应,这会导致 Chrome 中的视频播放错误。
示例: 当使用这样的请求直接访问服务器时:
GET server.domain.com/api/adFile/fileName with header: Range: bytes=168-3922822
我正确地收到了 206 响应。以下是响应中的一些相关标头:
当通过反向代理访问服务器时,请求如下:
GET proxy.domain.com/api/adFile/fileName with header: Range: bytes=168-3922822
我错误地收到了 200 状态代码和完整的文件内容。以下是该响应的相关标头:
我们有一个重写配置,在如下配置中将 ARR 视为反向代理:
Browser client (OriginA) <-> IIS/ARR (OriginB) <-> Server
Run Code Online (Sandbox Code Playgroud)
客户端是任意数量的网络浏览器。我们无法更改此配置。
Location
标头设置为http://origina/done.html和 HTTP 302。我已使用 Wireshark 验证了这一点。Location
标头更改为http://originb/done.html。这就是问题开始的地方。Location
。Location
GENERAL_RESPONSE_HEADERS 步骤中的标头。我已经启动了失败请求跟踪,这就是我看到的第 5 步和第 6 步。
是什么导致 IISLocation
在 ARR 之前重写标头?我可以使用其他任何 IIS 工具来解决这个问题吗?
我正在尝试做什么?
我正在设置蓝绿部署以实现零停机部署。
执行情况如何?
什么没有按预期工作?
当我从不同的 IP 地址连接到网站时,尤其是对于静态内容,蓝色/绿色应用程序接收到其他客户端拥有的错误 IP 地址(REMOTE_ADDR)。
例子:
当我检查 IIS 应用程序日志时,来自 B 的请求日志显示 IP 地址为“A”,尽管它应该是 B!
我还可以根据cookie确认请求来自B,我们在cookie中持有ip地址,根据IIS应用程序日志,cookie中的ip地址不等于REMOTE_ADDR。
编辑:我发现了另一个问题,“有时”某些 javascript 响应的 mime 类型在响应中变成了“text/html”,因为我们实现了 X-Content-Type-Options=nosniff,浏览器不会加载这些脚本。
Refused to execute script from 'https://foo.com/bundles/scripts/common?v=Pc3UWD-GF8GEIazC15mnIr_UYtcH3cQPlDPwAf2cXtU1' because its MIME type …
Run Code Online (Sandbox Code Playgroud) 我有一个 IIS 服务器,它托管了许多站点和 API。这些站点包括 Confluence 和 Jira 实例。这些产品实际上运行自己的 Web 服务器,因此应用程序请求路由和 URL 重写模块被用于将传入请求反向代理到documents.example.com' and 'jira.example.com' to
localhost:8080 and
localhost:8090` - confluence 和 jira 实例正在运行的地方。
现在我正在尝试为一个小的简单存储服务器 (s3) api (minio) 设置反向代理——它托管在 localhost:9000 上——但 s3 协议要求主机头是其消息身份验证代码的一部分。
但是,当应用程序请求路由按照 URL 重写规则重新路由请求时,它还会重写主机标头以反映新的目标标头。
这可以通过设置禁用,system.webServer.proxy:preserveHostHeaders
但只能在 ApplicationHost.config 中禁用,因为 ARR 运行服务器,而不是站点级别。
所以现在我有一个难题:
如果我设置了这个设置,那么在它们的 MAC 中使用主机头的 REST API 可以运行,但是 Confluence 和 Jira 作为它们支持的反向代理配置需要重写主机头。
作为参考,此设置可以保留主机标头
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/proxy -preserveHostHeader:true /commit:apphost
Run Code Online (Sandbox Code Playgroud) 有没有办法使用 ARR 将请求重新路由到 80/443 以外的端口(分别为默认的 http/https 端口)?我们有几个 Web 应用程序侦听 80 以外的端口,并希望使用 ARR 对它们进行负载平衡。这甚至可能吗?
我正在尝试配置 ARR,但似乎无法在 IIS 管理工具中的任何地方找到它。
我已经检查了权限问题(在安装期间和启动 IIS 管理器时)。ARR 显示为已安装的程序,我已尝试安装/卸载它。
可能是什么问题呢?
我正在尝试使用 ARR 和 urlrewrite 部署 jetty servlet 来创建反向代理。如果我启用“在响应标头中反向重写主机”,那么一切似乎都工作正常。我通过 www.example.com/servlet 访问 servlet,该地址在浏览器中保持不变,但通过 localhost:8080 访问 servlet。
问题是该 servlet 根据 get 参数返回 302 重定向。例如,如果我访问 www.example.com/servlet?input=cleaning 那么我将得到一个 302 重定向,该重定向可能会访问 www.cleaningexample.com/howtoclean。反向重写主机规则意味着客户端不会看到此 url,而是返回 www.example.com/howtoclean。
我无法设置静态出站规则,因为我事先不知道 302 重定向可能返回哪个地址。
如果我禁用反向重写主机,则浏览器中的 URL 将从 www.example.com/servlet 更改为 localhost:8080/servlet。
我尝试替换出站规则中的主机,但找不到任何地方可以获取 servlet 返回的原始位置标头,以替换重写的位置主机。
有没有办法让它正常工作?