WebDav rename fails on an Apache mod_dav install behind NginX
Solution 1:
(Back to the days when I used Subversion) I had similar problem with proxying to Apache SVN from Nginx SSL frontend. Suppose Nginx SSL frontend is https ://host and we'd like to proxy connections to the internal Apache SVN server http ://svn
The problem occurs when you try to copy a resource is with Destination
header:
COPY /path HTTP/1.1
Host: host
Destination: https://host/another_path
As you can see Destination
header still contains https
schema. The fix is pretty evident --
location / {
# to avoid 502 Bad Gateway:
# http://vanderwijk.info/Members/ivo/articles/ComplexSVNSetupFix
set $destination $http_destination;
if ($destination ~* ^https(.+)$) {
set $destination http$1;
}
proxy_set_header Destination $destination;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://svn;
}
Solution 2:
As @Cnly said, using set
directive won't work if there are special characters in both the original Destination
header and url. (I have no idea why)
I used map directive to resolve the issue.
http {
map $http_destination $http_destination_webdav {
~*https://(.+) http://$1;
default $http_destination;
}
server {
# ...server settings...
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Destination $http_destination_webdav;
proxy_pass http://svn;
}
}
}