Apache-2.2

WebDav 重命名在 NginX 後面的 Apache mod_dav 安裝上失敗

  • November 15, 2019

我正在嘗試解決通過 WebDav 重命名文件的問題。我們的堆棧由一台機器組成,通過 Nginx、Varnish 和 Apache 提供內容。當您嘗試重命名文件時,操作會因我們目前使用的堆棧而失敗。

要連接到 WebDav,客戶端程序必須:

  1. 通過https://host:443連接到 NginX
  2. NginX 解包並將請求轉發到http://localhost:81上的 Varnish 伺服器
  3. Varnish 將請求轉發到http://localhost:82上的 Apache ,後者通過 mod_dav 提供會話

以下是重命名失敗的範例:

$ 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

如需更多回饋,WebDrive windows 客戶端在重命名操作中記錄了錯誤 502(錯誤網關)和 303 (?)。擴展日誌提供了以下資訊:

目標 URI 指的是不同的方案或埠(https://hostname:443>)(想要:<http://hostname:82)。

其他一些限制:對 NginX 的 Webdav 模組的調查表明它並不真正滿足我們的需求,並且將 webdav 流量轉發到 Apache 不是一種選擇,因為我們不想啟用 Apache SSL。

有什麼方法可以欺騙 mod_dav 轉發到另一台主機?我對想法持開放態度:)。

(回到我使用 Subversion 的日子)我在從 Nginx SSL 前端代理到 Apache SVN 時遇到了類似的問題。假設 Nginx SSL 前端是 https://host,我們想代理連接到內部 Apache SVN 伺服器 http://svn

當您嘗試使用Destination標頭複製資源時會出現問題:

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

如您所見,Destination標題仍然包含https架構。修復很明顯——

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;
}

引用自:https://serverfault.com/questions/121766