我有一个运行 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 文章解释说它已被移至 Capabilities 部分。我通过功能添加了基本网址,但它仍然不起作用。
每次更改后我都重新启动了 Windows 服务。
我想做的是通过主机名使用存储库并适当地加载它。我在这里遗漏了一些明显的东西吗?它使用完整 URL 而不是相对 URL 是否还有其他原因?
在反向代理设置中,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
.所以规则最终看起来像这样:
同样,如果您的反向代理不是 HTTPS,请取出 Proto。
设置了这些标头后,您将不需要出站规则,正如您所指出的,它无法捕获 Javascript 文件中发生的大量内容。
最后,您可能需要考虑将基本 URL 功能保留在那里——根据文档,它确实用于一些事情。