我在通过反向代理访问 MDS 时遇到问题。
下面是我的基础设施设置的简化网络图。
所以,基本上我有 2 个分别用于 ssrs 和 mds 的应用程序服务器和一个 Web 服务器。
此外,还有一个负载均衡器可以为 Web 服务器提供请求。
我到处都在使用 Basic Authentication
。
我在 web 服务器上设置了反向代理,它根据 /mds
或 /reports
将 url 重写为 mds 或 ssrs 服务器。
入站规则 -
<rules>
<rule name="SSRS Reverse Proxy" stopProcessing="true">
<match url="^reports/(.*)" />
<action type="Rewrite" url="http://App1_IP/{R:0}" logRewrittenUrl="false" />
<serverVariables>
<set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
<set name="HTTP_ACCEPT_ENCODING" value="" />
</serverVariables>
</rule>
<rule name="SSRS Report Server Reverse Proxy" stopProcessing="true">
<match url="^reportserver/(.*)" />
<action type="Rewrite" url="http://App1_IP/{R:0}" logRewrittenUrl="false" />
<serverVariables>
<set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
<set name="HTTP_ACCEPT_ENCODING" value="" />
</serverVariables>
</rule>
<rule name="MDS Reverse Proxy" stopProcessing="true">
<match url="^mds/(.*)" />
<action type="Rewrite" url="http://App2_IP/{R:0}" logRewrittenUrl="false" />
<serverVariables>
<set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
<set name="HTTP_ACCEPT_ENCODING" value="" />
</serverVariables>
</rule>
</rules>
出站规则 -
<outboundRules>
<rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsHtml1">
<match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="^http(s)?://App1_IP/(.*)" />
<action type="Rewrite" value="http{R:1}://WebServer_IP/{R:2}" />
</rule>
<rule name="ReverseProxyOutboundRule2" preCondition="ResponseIsHtml1">
<match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="^http(s)?://App2_IP/(.*)" />
<action type="Rewrite" value="http{R:1}://WebServer_IP/{R:2}" />
</rule>
<rule name="ResponseAcceptEncoding" preCondition="NeedRestoringAcceptEncoding">
<match serverVariable="HTTP_ACCEPT_ENCODING" pattern="^(.*)" />
<action type="Rewrite" value="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" />
</rule>
<preConditions>
<preCondition name="ResponseIsHtml1">
<add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
</preCondition>
<preCondition name="NeedRestoringAcceptEncoding">
<add input="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" pattern=".*|" />
</preCondition>
</preConditions>
</outboundRules>
SSRS 规则运行良好。但是当用户访问MDS时,页面无法正常显示,并不断提示输入用户名和密码。当我查看网络流量时,似乎对一些 javascript 文件和/MDS/api/的调用是未经授权的。
我不确定出了什么问题,为什么 ssrs 可以,但 mds 不行。感谢任何指针。
谢谢。
更新 (20191008) -
控制台面板显示与“Access-Control-Allow-Origin”相关的错误,所以我在 MDS 网站中添加了自定义标题。但问题仍然存在。
更新 (20191009) -
我想我已经指出了这个问题。我在直接调用应用服务器然后通过反向代理时比较了请求 header 。我意识到通过代理调用时,缺少“授权” header 。似乎代理删除了授权 header 。
这是正常的行为吗?通过代理调用时如何强制使用授权 header ?
为什么它与 SSRS 一起工作而不是与 MDS 一起工作?
最佳答案
你真的应该用 WebServer_IP
替换你的出站重写规则中的 {HTTP_HOST}
(我认为这是 IIS 的正确表示法,它应该解析为客户端请求的主机)。这应该避免 CORS 机制启动(以及访问服务所需的 SSL 证书、NATting、本地主机或 dns 条目可能存在问题)。
此外,如果 CORS 到位,您将需要一些特殊的 CORS 配置以允许浏览器发送凭据。
此外,您可以从控制台发布更详细的错误消息(related to "Access-Control-Allow-Origin"
非常模糊)。
关于reporting-services - 具有反向代理的主数据服务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58217137/