转发到另一个 Nexus 时 SonaType Nexus NuGet 代理 404

SonaType Nexus NuGet proxy 404 when forwarding to another Nexus

我们有 2 个带有 NuGet 代理存储库的 Nexus SSO 服务器。一个在我们的专用网络环境中(v3.0.0),另一个在 DMZ(v3.0.1)中,可以访问互联网。

请求首先被发送到私有 Nexus 服务器,该服务器将请求转发到 DMZ 中的 Nexus 服务器,后者又将请求转发到外部 nuget.org 存储库。所以基本上:

客户端 -> 私有代理 -> dmz 代理 -> 互联网。

使用此方法,客户端收到错误无法找到包。从私有代理的日志中,我看到它将请求转发到 dmz 代理 http://dmzproxy/repository/NuGetRepository/FindPackagesById?id='angularjs' 但收到 404 未找到。

解决问题,我试图通过 运行 nuget.exe 直接从该服务器绕过私人代理,这将是:

客户端 -> dmz 代理 -> 互联网

这个方法确实有效,通过使用 nuget.exe 和 -Verbosity detailed,我可以看到 nuget.exe 向 dmz 代理发送的请求与私有代理发送的请求略有不同:

http://dmzproxy/repository/NuGetRepository/FindPackagesById()?id='angularjs'

对比一下Nexus发送的请求,不同的是FindPackagesById后面的括号()。因此,为了测试,我 copy/pasted 都在浏览器 window 中请求 URL,实际上,没有括号我得到 404,有括号我得到一个包提要页面。

因此,Nexus 在为 NuGet 提供服务时确实使用括号,但在将请求转发到另一个 Nexus 服务器时似乎没有应用它们,导致 404 响应。

经过进一步测试和联系SonaType支持,我发现Nexus 3.0.0和3.0.1确实不支持使用FindPackagesById请求?没有括号,即使这正是 Nexus 本身转发请求的方式。

最新的 Nexus 版本(目前是 3.2.1),虽然仍然转发不带括号的请求,但确实支持这两种方式。因此,将所有 Nexus 服务器更新到最新版本应该可以解决此问题。

在这个特定的组织内,更新说起来容易做起来难。所以与此同时,我配置了一个带有重写规则的反向代理,它将请求从私有 Nexus 服务器转发到 DMZ 中的 Nexus 服务器,并将 "FindPackagesById?" 重写为 "FindPackagesById()?"。在更新所有 Nexus 服务器之前,这不是一个理想的情况,而是一个有效的临时解决方案。