我有一台在 上运行 Nexus Repository OSS 的 Windows Server 2012-R2 服务器localhost:8081
。我在 IIS 中使用以下规则配置了反向代理:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="ReverseProxyInboundRule1" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="http://localhost:8081/{R:1}" />
</rule>
</rules>
<outboundRules>
<preConditions>
<preCondition name="ResponseIsHtml1">
<add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
</system.webServer>
</configuration>
当我从另一个系统访问该网站并导航到 nexus.mycompany.com 时,我可以看到代理正在工作……大部分。所有依赖的 css、js 等都是localhost:8081
远程机器无法解析的。
我尝试添加一条出站规则,希望它能够解决问题,但没有成功。
<rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsHtml1">
<match filterByTags="A, Form, Img" pattern="^http(s)?://localhost:8081/(.*)" />
<action type="Rewrite" value="http{R:1}://nexus.mycompany.com/{R:2}" />
</rule>
看看文档,我尝试设置基本 URL。它描述的按钮不在 GUI 中。我找到了一篇 Stack Overflow 文章,解释说它已被移至功能部分。我通过功能添加了基本 URL,但仍然不起作用。
每次更改后我都重新启动了 Windows 服务。
我想要做的是通过主机名访问存储库并使其正确加载。我是否遗漏了某些明显的东西?使用完整 URL 而不是相对 URL 还有其他原因吗?
答案1
在反向代理设置中,Nexus 会查找各种X-Forwarded-*
HTTP 标头的存在情况,以确定其基本 URL。只要您正确设置这些标头,它就会生成正确的 URL,无需出站规则。
诀窍在于知道哪些可以通过——反向代理文档似乎没有特别清楚这些是什么,他们只是提供了 nginx 和 Apache 示例,没有太多解释。我怀疑 nginx 和 Apache 会自动设置必要的标头,而 Nexus 已经采用了这些标头。这都是“事实上的标准”,而不是正式的标准,因此虽然您会看到应用程序支持的标头相当一致,但这并不能保证。
在我的案例中,我需要以下两个:
X-Forwarded-Host
告诉 Nexus 客户端请求的原始主机。在您的示例中,这将是“nexus.mycompany.com”。X-Forwarded-Proto
可用于告诉 Nexus 原始请求(即向您的代理发出的请求)是 HTTPS,即使 Nexus 本身未运行 HTTPS。如果您的代理不是 HTTPS,则您不需要此功能。
标头在服务器变量部分设置 - 用下划线替换破折号,并在前面加上“HTTP_”,因此X-Forwarded-Host
变成HTTP_X_Forwarded_Host
。
因此规则最终看起来是这样的:
<rule name="ReverseProxyInboundRule1" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="http://localhost:8081/{R:1}" />
<serverVariables>
<set name="HTTP_X_Forwarded_Proto" value="https" />
<set name="HTTP_X_Forwarded_Host" value="nexus.mycompany.com" />
</serverVariables>
</rule>
再次,如果您的反向代理不是 HTTPS,请取出 Proto。
设置这些标头后,您就不再需要出站规则,正如您所说,该规则无法捕获 Javascript 文件中发生的许多事情。
最后,你可能要考虑保留 Base URL 功能——根据文档它确实有用于一些事情。