Apache-2.2
WebDav 重命名在 NginX 後面的 Apache mod_dav 安裝上失敗
我正在嘗試解決通過 WebDav 重命名文件的問題。我們的堆棧由一台機器組成,通過 Nginx、Varnish 和 Apache 提供內容。當您嘗試重命名文件時,操作會因我們目前使用的堆棧而失敗。
要連接到 WebDav,客戶端程序必須:
- 通過https://host:443連接到 NginX
- NginX 解包並將請求轉發到http://localhost:81上的 Varnish 伺服器
- 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; }