我在C#中编写了自己的托管IIS HTTP模块.它的目的是在某些条件下简单地设置X-Forwarded-For和X-Forwarded-Proto请求头(这不能用路由规则处理).该模块必须部署到我们的负载均衡器(除了安装了ARR和配置的服务器场的IIS之外).由于某些原因,标头已设置但不会传输到负载平衡器后面的Web服务器.我知道,因为我检查了失败的请求跟踪输出日志.
以下是我们的负载均衡器上安装的所有IIS模块的屏幕截图:
如您所见,我的托管模块"QA.XForwardedHeadersModule"在ApplicationRequestRouting(ARR)本机模块之前加载.但无论如何都不会传输标题.我甚至用Wireshark跟踪了我的请求.根本没有任何X-Forwarded标头.
这是否意味着托管模块与本机模块不完全兼容,而本机模块(如ARR)无法查看使用托管模块设置的请求标头(如我的自定义编写模块)?这个问题有可能解决方法吗?
尝试在几个后端IIS服务器前使用AAR作为反向代理.
分配给运行IIS/AAR的服务器的一个公共IP地址
然后设置出站URL重写规则,以根据主机名重定向到多个后端服务器之一.
有点工作,但总是返回后端服务器默认站点(不是映射到主机名的站点),所以看起来主机名(HTTP_HOST)没有从代理服务器传递到后端服务器.
(我已通过编辑主机验证绕过反向代理,后端服务器返回绑定到主机头的正确站点)
这是规则的一个示例(192.168.0.99是内部服务器,site.myco.com是主机名)
<rewrite>
<rules>
<rule name="ReverseProxyInboundRule1" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="http://192.168.1.99/{R:1}" />
</rule>
</rules>
</rewrite>
Run Code Online (Sandbox Code Playgroud)
已经尝试过设置服务器变量
<!-- Guessing server.myco.com is hard coded -->
<serverVariables>
<set name="HTTP_HOST" value="server.myco.com" />
</serverVariables>
<!-- Guessing picked up dynamically from incoming request host header -->
<serverVariables>
<set name="HTTP_HOST" value="{HTTP_HOST}" />
</serverVariables>
Run Code Online (Sandbox Code Playgroud)
但是唉总是返回默认绑定 - 任何想法?
我们拥有服务器A,有时我们会在服务器B上向我们的合作伙伴重写请求.
在某些情况下,服务器B将通过重定向到完全不同的网站进行响应,这就是预期的,假设服务器C.但是,当重定向表单服务器B返回到服务器A时,服务器A将其解释为重定向到服务器A.在iteself(A)上的位置而不是作为到其他网站的重定向 - 服务器C.
我如何注意到重定向到外部网站并实际去那里,而不是假设重定向在我的服务器上(和404ing)?我们正在使用重写模块运行IIS 7.
任何帮助非常感谢.
我正在实现一个反向代理,用于将请求路由到后端服务器.
功能上一切正常,但是我担心来自后端服务器的所有响应都会在没有压缩的情况下传输到客户端(Web浏览器).
设置如下:
https://internal.app
https://site.com
.我想所有请求路由到https://site.com/app/WHATEVER
到https://internal.app/WHATEVER
的方式是透明的客户.
我当前的设置基于URL Rewrite 2.0和Application Request Routing IIS扩展.一般方法基于以下文章的指导原则:
有关节web.config
的的site.com
应用程序:
<system.webServer>
<rewrite>
<rules>
<rule name="Route the requests for backend app" stopProcessing="true">
<match url="^app/(.*)" />
<conditions>
<add input="{CACHE_URL}" pattern="^(https?)://" />
</conditions>
<action type="Rewrite" url="{C:1}://internal.app/{R:1}" />
<serverVariables>
<set name="HTTP_ACCEPT_ENCODING" value="" />
</serverVariables>
</rule>
</rules>
<outboundRules>
<rule name="RewriteBackendAbsoluteUrlsInResponse" preCondition="ResponseIsHtml1">
<match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="^http(s)?://internal.app(\:80)?/(.*)" />
<action type="Rewrite" value="/app/{R:3}" …
Run Code Online (Sandbox Code Playgroud) 我在Tomcat前面使用IIS7应用程序请求路由作为ISAPI重定向的替代.基本的反向代理功能运行良好,但我在最终请求标头中没有足够的信息.我的应用程序存在于几个子域:customerone.ourservice.com,customertwo.ourservice.com等.每个子域运行相同的应用程序,但具有不同的品牌图形.
应用程序当前查看Host标头以告知要显示的品牌.当我使用IIS7反向代理时,该信息将丢失.我的标题现在是:
accept = text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
accept-charset = ISO-8859-1,utf-8;q=0.7,*;q=0.7
accept-encoding = gzip,deflate
accept-language = en-gb,en;q=0.7,en-us;q=0.3
cookie = JSESSIONID=......
host = 127.0.0.1:8080
max-forwards = 10
user-agent = Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.15) Gecko/2009102815 Ubuntu/9.04 (jaunty) Firefox/3.0.15
x-original-url = /
x-forwarded-for = [iis7ip]:47567
x-arr-log-id = affbf81c-a5cf-4212-a43b-901cd9adcee6
connection = Keep-Alive
Run Code Online (Sandbox Code Playgroud)
有什么办法可以将原始主机头插入反向代理传递的请求头中吗?
我有一个共享模式的Windows Azure网站.
现在Azure显然在我的网站上添加了两个cookie:WAWebSiteID
和ARRAffinity
.我了解到那些cookie可用于启用Azure负载均衡器后面的应用程序和请求路由功能(ARR)的粘性会话.
尽管如此,我的网站不需要粘性会话,我也不希望有这些cookie.
首先,我从来没有想到粘性会话在我脑海中浮现,所以我编写了应用程序,以便在所有前端均匀分布的请求中很好地扩展.实际上,粘性会话会改变分发,因为有很多客户做了很多请求而客户几乎没有.当只有第一个请求被分发并且来自同一客户端的后续请求粘贴到同一服务器时,这会严重影响我的应用程序的整体性能.
其次,出于数据隐私原因,我运行了一个无cookie应用程序,任何cookie都被认为是"邪恶的".我知道我可以用一点点javascript删除它们,但我甚至不希望它们被传输到客户端.
问题是:如何在服务器端的Azure网站上禁用粘性会话和这两个cookie?
我在IIS 7.5站点上进行了URL重写设置:http://site1.com/
这充当了第二个站点的反向代理:http://site2.com/
以下是事件流:
1.浏览器在http://site1.com/somepath上执行GET
2.这会传递到site2,因为site1是URL Rewrite reverse proxy.这很好,主机设置正确,因为我已经完成了需要这个的mod.
3. site2以301状态响应,并将HTTP Location标头设置为http://site3.com/somenewpath
4. site1使用301响应浏览器,但用site1 替换 Location标头中的主机:http:// site1 .COM/somenewpath
我想在第4步中发生的是,site1 在HTTP Location标头中以http://site3.com/somenewpath响应并直接传递此数据.我觉得必须有一个出站规则可以应用来解决这个问题,但还没有弄清楚.
我们需要通过IIS代理代理Meteor.IIS站点接受特定Meteor网站的绑定,并将请求代理到备用端口.
Web套接字不起作用,Meteor正在恢复XHR.
Web.Config文件如下:
<rule name="Meteor reverse proxy" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{CACHE_URL}" pattern="^(.+)://" />
</conditions>
<action type="Rewrite" url="{C:1}://127.0.0.1:8008/{R:1}" />
</rule>
Run Code Online (Sandbox Code Playgroud)
通过服务器上的127.0.0.1:8008访问网站,它工作正常.通过IIS代理访问网站失败.
我注意到IIS ARR正在更改标题的大小写,删除标题(sec-websocket-extensions)并添加一些额外内容.这可能没有关系.
IIS代理:
直接:
MS文档建议在与NodeJS一起使用时禁用WebSockets.更新此设置无济于事. http://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-websocket-protocol-support#TOC301258519
有人遇到过这个问题吗?
更新 您会注意到上面的标题引用了ARR2.5,此版本不支持Web套接字.代理套接字需要3.0.
我正在尝试在PowerShell中自动创建服务器场.通过手动创建,我得到了以下XML:
<webFarms>
<webFarm name="alwaysup" enabled="true">
<server address="alwaysup-blue" enabled="true">
<applicationRequestRouting httpPort="8001" />
</server>
<server address="alwaysup-green" enabled="true">
<applicationRequestRouting httpPort="8002" />
</server>
<applicationRequestRouting>
<healthCheck url="http://alwaysup/up.html" interval="00:00:05" responseMatch="up" />
</applicationRequestRouting>
</webFarm>
<applicationRequestRouting>
<hostAffinityProviderList>
<add name="Microsoft.Web.Arr.HostNameRoundRobin" />
</hostAffinityProviderList>
</applicationRequestRouting>
</webFarms>
Run Code Online (Sandbox Code Playgroud)
试图通过PS来做到这一点证明是麻烦的:据我所知,没有专门的API来实现这一点(WebFarmSnapin用于旧版本).
我已将注意力转移到IIS管理Cmdlet,但只有一半工作.
我的代码:
#####
# Overwriting the server farm
#####
Write-Host "Overwriting the server farm $($webFarmName)"
$webFarm = @{};
$webFarm["name"] = 'siteFarm'
Set-WebConfiguration "/webFarms" -Value $webFarm
#####
# Adding the servers
#####
Write-Host "Adding the servers"
$blueServer = @{}
$blueServer["address"] = …
Run Code Online (Sandbox Code Playgroud) 我的生产设置如下:
使用IIS URL Rewrite,对M2的任何请求,例如http:// m2 /app/login.aspx将被重定向到M1,如http:// m1 /app/login.aspx.
在M1上,ASP.NET Open Auth已在网站上实施,以使用Google外部身份验证.当用户点击Google按钮时,浏览器将被重定向到Google登录页面以允许用户进行身份验证.
但是当从M2访问网站时,.net oAuth(https:// accounts.google.com/[query-string])生成的重定向网址将重定向到Google,正在被URL重写替换为http:// m2/[query-string].
所以要清楚; 当通过外部身份验证提供程序进行身份验证请求时,将返回302重定向.通常这种形式可能如下所示:
响应标题:
...
位置:https:// accounts.google.com/o/oauth2/auth?big_long_query_string
...
此重定向由位于代理服务器后面的服务器(M1)创建(M2 - IIS URL Rewrite 2.0 + ARR 3.0).因此,重写服务器将Location标头重写为:
响应标题:
...
位置:http:// M1/o/oauth2/auth?big_long_query_string
...
我们需要的是一条规则,它不会在重定向时重写位置URL.它也只能针对某些重定向.大多数情况下,这里提到的行为是必需的,因为所有重定向都被重定向到主代理服务器.有人可以为某些重定向建议解决方案或解决方法吗?