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

我在做什么?

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

如何执行?

  1. 我有一台服务器。
  2. 我创build了一个networking农场。
  3. 我设置了3个网站蓝色,绿色,主要在不同的端口。 Main处理来自客户端的所有请求,并将请求重写到Web场。
  4. Web场通过ARR(应用程序请求路由)将请求路由到活动网站(蓝色或绿色)
  5. 由于从Web Farm / ARR接收请求的蓝/绿网站,REMOTE_ADDR(客户端IP地址)显示127.0.0.1。
  6. 我不希望它,虽然它是预期的,我已经创build了一个URL重写规则,在主网站设置HTTP_X_FORWARDED_FOR_INTERNAL服务器variablesREMOTE_ADDR。
  7. 我在蓝色/绿色网站上创build了另一个规则,用来自主网站的HTTP_X_FORWARDED_FOR_INTERNAL设置REMOTE_ADDR服务器variables。
  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响应的MIMEtypes正在成为“文本/ 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 ('text/html') is not executable, and strict MIME type checking is enabled. 

编辑2 :我find了一些有用的东西。 当我访问一些返回40x状态码的链接时。 与每次IP地址重放有关的错误。 在我未经authentication之后,这里是我被redirect的URL。

https://foo.com/account/signin?sessionExpired=true&returnUrl=%2ferror%2fnotfound%2f%3f404%3bhttps%3a%2f%2ffoo.com%3a10003%2ferror%2fnotfound

returnUrl的解码值是:“/ error / notfound /?404; https://foo.com:10003/error/notfound ”

奇怪的?

我试图解决的情况是什么?

我认为这是某种caching问题,然后我禁用了所有我知道的caching机制;

  1. 从全局设置中禁用IIScaching。
  2. 通过创buildcaching控制规则禁用ARRcaching。
  3. 禁用Web场caching。

但它没有工作。

我已经清除了所有的configuration,并使用了针对这种configuration转发IP地址到后端Web应用开发的ARR Helper ,我遇到了同样的问题。

您可能需要的configuration文件

在主Web应用程序中设置HTTP_X_FORWARDED_FOR_INTERNAL的规则。

 <rule name="Set HTTP_X_FORWARDED_FOR_INTERNAL"> <match url="(.*)" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false" /> <serverVariables> <set name="HTTP_X_FORWARDED_FOR_INTERNAL" value="{REMOTE_ADDR}" /> </serverVariables> <action type="None" /> </rule> 

在蓝色/绿色应用程序中设置REMOTE_ADDR的规则。

 <rule name="Set REMOTE_ADDR"> <match url="(.*)" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> <add input="{HTTP_X_FORWARDED_FOR_INTERNAL}" pattern="^$" negate="true" /> </conditions> <serverVariables> <set name="REMOTE_ADDR" value="{HTTP_X_FORWARDED_FOR_INTERNAL}" /> <set name="REMOTE_HOST" value="{HTTP_X_FORWARDED_FOR_INTERNAL}" /> </serverVariables> <action type="None" /> </rule> 

在全局级别禁用ARRcaching的规则。

  <rewrite> <globalRules> <rule name="ARR_CacheControl_9dc69ea7-26f6-4654-af58-2e289d681463" enabled="true" patternSyntax="Wildcard" stopProcessing="true"> <match url="*" /> <serverVariables> <set name="ARR_CACHE_CONTROL_OVERRIDE" value="1,no-cache" /> </serverVariables> <action type="None" /> </rule> </globalRules> </rewrite> 

整个Web场configuration

 <webFarms> <webFarm name="iissucks" enabled="true"> <server address="bluecloud" enabled="true"> <applicationRequestRouting httpPort="880" httpsPort="8443" /> </server> <server address="greencloud" enabled="true"> <applicationRequestRouting httpPort="980" httpsPort="9443" /> </server> <applicationRequestRouting> <healthCheck url="https://iissucks/account/signin" interval="00:00:01" statusCodeMatch="200-599" responseMatch="I_am_healthy." /> <protocol xForwardedForHeaderName="X-Forwarded-For-Farm" includePortInXForwardedFor="false"> <cache enabled="false" queryStringHandling="NoCaching" validationInterval="00:00:00" /> </protocol> </applicationRequestRouting> </webFarm> <applicationRequestRouting> <hostAffinityProviderList> <add name="Microsoft.Web.Arr.HostNameRoundRobin" /> </hostAffinityProviderList> </applicationRequestRouting> </webFarms> 

我不是一个IIS专家,但我发现你的问题很有趣。 我看到你的全局caching禁用规则中设置了一个stopProcessing="true"参数。 在caching禁用规则停止处理任何进一步的规则之后,也许您的variables设置规则不会被执行。