标签: arr

URL 重写条件可以比较两个服务器变量吗?

我正在尝试将两个服务器变量作为 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
  • 传入的请求是通过 SSL: {HTTPS}is "on"
  • 传入的 URL 不以斜杠结尾。
  • 传出的 Location 标头以斜杠结尾。

以上都是在前提条件下处理的。棘手的部分是最后一点:

  • 传出 Location 标头的路径与传入 URL 相同,并附加了斜杠。

下面是我到目前为止的代码。前提条件和标头重写都可以正常工作。但是,该条件会导致 500 错误(URL 重写模块错误),大概是因为我{REQUEST_URI}在模式中使用。我尝试将条件分成两个并使用捕获组,但这也不起作用。有任何想法吗?

<rule name="Fix: Courtesy Redirect + SSL Offloading = …
Run Code Online (Sandbox Code Playgroud)

rewrite iis-7.5 arr outboundrules

5
推荐指数
1
解决办法
2330
查看次数

ARR 反向代理到 Azure 云服务内的 Azure 网站

我正在尝试将 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。在该服务器上,一切正常。

有人可以指出我如何解决问题的正确方向,或者甚至可能吗?

iis reverse-proxy azure arr

5
推荐指数
0
解决办法
1027
查看次数

通过 ARR 运行时,大文件的 POST 超时

当通过 ARR POST 一个大文件时,请求在 120 秒后超时。客户端收到错误代码502 Bad Gateway。我已将 Web 场的“代理超时”配置为 600 秒。我还配置了Connection time-outDefault 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 high-availability load-balancing arr

5
推荐指数
1
解决办法
7131
查看次数

IIS应用请求路由将206部分内容改为200

我已经使用 IIS 重写规则和应用程序请求路由模块在 azure 云服务中设置了一个反向代理服务器(根据此处的说明。除了调用我为下载 mp4 文件而创建的端点外,一切都运行良好。这些端点当请求包含 Range 标头时,可以提供部分内容。我遇到的问题是,当我直接点击服务器时,它会正确响应 206(部分内容)和正确的字节范围,但有时当我点击端点通过代理服务器,它以 200 和完整的文件内容响应,这会导致 Chrome 中的视频播放错误。

示例: 当使用这样的请求直接访问服务器时:

GET server.domain.com/api/adFile/fileName with header: Range: bytes=168-3922822

我正确地收到了 206 响应。以下是响应中的一些相关标头:

  • 缓存控制:无缓存
  • 编译指示:无缓存
  • 内容长度:3922655
  • 内容类型:视频/mp4
  • 内容-MD5:f1+K8OT8TEjvtlPU5iUY8a==
  • 内容范围:字节 168-3922822/3922823
  • 过期时间:-1
  • 最后修改时间:2016 年 2 月 16 日,星期二 15:46:46 GMT
  • ETag:“0x8D336E86040C217”
  • 服务器:Microsoft-IIS/8.0
  • X-AspNet 版本:4.0.30319
  • X-Powered-By: ASP.NET

当通过反向代理访问服务器时,请求如下:

GET proxy.domain.com/api/adFile/fileName with header: Range: bytes=168-3922822

我错误地收到了 200 状态代码和完整的文件内容。以下是该响应的相关标头:

  • 缓存控制:无缓存
  • 编译指示:无缓存
  • 内容长度:3922823
  • 内容类型:视频/mp4
  • 内容-MD5:f1+K8OT8TEjvtlPU5iUY8a==
  • 过期时间:-1 最后修改时间:2016 年 2 月 16 日,星期二 15:46:46 GMT
  • ETag:“0x8D336E86040C217”
  • 服务器:Microsoft-IIS/8.5
  • X-AspNet 版本:4.0.30319
  • X-Powered-By: ASP.NET
  • X-Powered-By:ARR/3.0 …

iis cloud azure arr

5
推荐指数
1
解决办法
1163
查看次数

IIS 在 ARR 之前重写位置标头

我们有一个重写配置,在如下配置中将 ARR 视为反向代理:

Browser client (OriginA) <-> IIS/ARR (OriginB) <-> Server
Run Code Online (Sandbox Code Playgroud)

客户端是任意数量的网络浏览器。我们无法更改此配置。

  1. 客户端请求http://originb/return,请求中包含http://origina/done.html等 URL。
  2. 然后 ARR 将请求转发到http://server/return
  3. 服务器响应时将Location标头设置为http://origina/done.html和 HTTP 302。我已使用 Wireshark 验证了这一点。
  4. 管道中的 IIS 正在将Location标头更改为http://originb/done.html这就是问题开始的地方。
  5. ARR 在标头的 PATTERN_MATCH 步骤中查看 originb URL Location
  6. ARR 将 originb URL 报告为LocationGENERAL_RESPONSE_HEADERS 步骤中的标头。
  7. 客户端盲目接受URL并重定向到不存在的http://originb/done.html而不是http://origina/done.html

我已经启动了失败请求跟踪,这就是我看到的第 5 步和第 6 步。

是什么导致 IISLocation在 ARR 之前重写标头?我可以使用其他任何 IIS 工具来解决这个问题吗?

iis http arr

5
推荐指数
1
解决办法
3436
查看次数

ARR 在客户端用户之间混合 HTTP 服务器变量

我正在尝试做什么?

我正在设置蓝绿部署以实现零停机部署。

执行情况如何?

  1. 我有一台服务器。
  2. 我创建了一个网络农场。
  3. 我在不同的端口设置了蓝色、绿色、主要的 3 个网站。Main 处理来自客户端的所有请求并将请求重写到 Web Farm。
  4. Web 场通过 ARR(应用程序请求路由)将请求路由到活动网站(蓝色或绿色)
  5. 由于蓝/绿网站收到来自 Web Farm/ARR 的请求,因此 REMOTE_ADDR(客户端 IP 地址)显示为 127.0.0.1。
  6. 我不想要它,尽管它是预期的,但我创建了一个 URL 重写规则,该规则在主网站上使用 REMOTE_ADDR 设置 HTTP_X_FORWARDED_FOR_INTERNAL 服务器变量。
  7. 我在蓝/绿网站上创建了另一个规则,该规则使用来自主网站的 HTTP_X_FORWARDED_FOR_INTERNAL 设置 REMOTE_ADDR 服务器变量。
  8. 结果,我将 REMOTE_ADDR 作为真实的客户端 IP 地址。好极了!
  9. 对于单个客户端用户,一切正常。

什么没有按预期工作?

当我从不同的 IP 地址连接到网站时,尤其是对于静态内容,蓝色/绿色应用程序接收到其他客户端拥有的错误 IP 地址(REMOTE_ADDR)。

例子:

  1. A和B是不同的IP地址。
  2. A 连接到 foo.com/somestaticfile.css。
  3. B 连接到 foo.com/somestaticfile.css。

当我检查 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 load-balancing web-farm arr

5
推荐指数
1
解决办法
1131
查看次数

设置 IIS 反向代理以保留主机标头

我有一个 IIS 服务器,它托管了许多站点和 API。这些站点包括 Confluence 和 Jira 实例。这些产品实际上运行自己的 Web 服务器,因此应用程序请求路由和 URL 重写模块被用于将传入请求反向代理到documents.example.com' and 'jira.example.com' tolocalhost:8080 andlocalhost: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)

iis reverse-proxy amazon-s3 arr

5
推荐指数
1
解决办法
4605
查看次数

在非 80 端口上使用 ARR + IIS 进行负载平衡

有没有办法使用 ARR 将请求重新路由到 80/443 以外的端口(分别为默认的 http/https 端口)?我们有几个 Web 应用程序侦听 80 以外的端口,并希望使用 ARR 对它们进行负载平衡。这甚至可能吗?

iis iis-7.5 arr

3
推荐指数
1
解决办法
6003
查看次数

为 IIS 安装了应用程序请求路由,但在 IIS 的管理工具中看不到它

我正在尝试配置 ARR,但似乎无法在 IIS 管理工具中的任何地方找到它。

我已经检查了权限问题(在安装期间和启动 IIS 管理器时)。ARR 显示为已安装的程序,我已尝试安装/卸载它。

可能是什么问题呢?

iis configuration arr

3
推荐指数
2
解决办法
1万
查看次数

使用 UrlRewrite 防止 ARR 重写 302 重定向的 Location 标头

我正在尝试使用 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 返回的原始位置标头,以替换重写的位置主机。

有没有办法让它正常工作?

iis rewrite reverse-proxy arr

3
推荐指数
1
解决办法
5944
查看次数