反向代理服务器后面的 Subversion Edge returns HTTP 状态 502 'Bad Gateway'

Subversion Edge behind reverse proxy server returns HTTP status 502 'Bad Gateway'

我在反向代理服务器后面使用 Subversion Edge 5.2.2。乍一看,所有服务 ViewVC、控制台和 Subversion 服务器看起来都很好/工作正常。

然而,Subversion 服务器不适用于特定的 Subversion 命令,例如 svn cp returns

svn: E175002: Unexpected HTTP status 502 'Bad Gateway' on '/svn/petclinic/!svn/rvr/16/trunk'

如果我绕过反向代理并直接访问 Subversion Edge,这些命令就可以工作。

Subversion Edge 文档没有任何关于反向代理配置的信息,因此这个 "enterprise" 产品似乎不支持这种典型的 "enterprise" 部署模式。

能否将 Subversion Edge 工作配置为在反向代理后面正常工作?应该如何配置?

出现这个错误是因为nginx把Destinationheader不加修改的传给了subversion服务器。如果你在 nginx 服务器上使用 https 但在 subversion 服务器上只使用 http,subversion 将无法执行 COPY 或 MOVE 方法,因为Destination header 包含一个 https:// 值。

您可以通过检查 nginx 的 access.log 来确认这一点;如果您看到带有 502 响应的 COPY 或 MOVE 请求,然后是 DELETE,那么这很可能是问题所在,例如:

… COPY /foo/!svn/rvr/111/trunk HTTP/1.1" 502 …
… DELETE /foo/!svn/txn/111-6v HTTP/1.1" 204 …

您可以通过在任一服务器上重写目标 header 来解决此问题:

Subversion 服务器上的 Apache

RequestHeader edit Destination ^https http early

nginx代理服务器:

set $dest $http_destination;
if ($http_destination ~ "^https://(.+)$") {
    set $dest http://;
}
proxy_set_header Destination $dest;