A renomeação de WebDav falha em uma instalação do mod_dav do Apache por trás do NginX

4

Estou tentando resolver um problema com a renomeação de arquivos pelo WebDav. Nossa pilha consiste em uma única máquina, servindo conteúdo através do Nginx, Varnish e Apache. Quando você tenta renomear um arquivo, a operação falha com a pilha que estamos usando no momento.

Para se conectar ao WebDav, um programa cliente deve:

  1. Conecte-se pelo link ao NginX
  2. O NginX desembrulha e encaminha a solicitação para um servidor Varnish no link
  3. Varnish encaminha a solicitação ao Apache no link , que oferece uma sessão via mod_dav

Veja um exemplo de falha na renomeação:

$ cadaver https://webdav.domain/
Authentication required for Webdav on server 'webdav.domain':
Username: user
Password:

dav:/> cd sandbox
dav:/sandbox/> mkdir test
Creating 'test': succeeded.

dav:/sandbox/> ls
Listing collection '/sandbox/': succeeded.
Coll:   test                                   0  Mar 12 16:00

dav:/sandbox/> move test newtest
Moving '/sandbox/test' to '/sandbox/newtest':  redirect to http://webdav.domain/sandbox/test/

dav:/sandbox/> ls
Listing collection '/sandbox/': succeeded.
Coll:   test                                   0  Mar 12 16:00

Para mais comentários, o cliente de janelas do WebDrive registrou um erro 502 (Bad Gateway) e 303 (?) na operação de renomeação. Os logs estendidos forneceram esta informação:

Destination URI refers to different scheme or port (https://hostname:443) (want: http://hostname:82).

Algumas outras restrições: Investigações nos módulos do Webdav do NginX mostram que ele realmente não atende às nossas necessidades, e o encaminhamento do tráfego do webdav para o Apache não é uma opção porque não queremos ativar o Apache SSL.

Existe alguma maneira de enganar o mod_dav para encaminhar para outro host? Estou aberto a idéias:).

    
por heymatthew 12.03.2010 / 04:20

1 resposta

6

(Voltando aos dias em que eu usei o Subversion) eu tive um problema parecido com o proxying para o Apache SVN do frontend SSL do Nginx. Suponha que o front-end SSL do Nginx seja https: // host e que gostaríamos de fazer proxy de conexões com o servidor interno do Apache SVN http: // svn

O problema ocorre quando você tenta copiar um recurso com Destination header:

COPY /path HTTP/1.1
Host: host
Destination: https://host/another_path

Como você pode ver, o Destination header ainda contém https schema. A correção é bem evidente -

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;
}
    
por 12.03.2010 / 10:06