Apache错误的RewriteRule用于WebDAV服务

时间:2016-06-08 16:18:17

标签: apache mod-rewrite webdav

我遇到了一个RewriteRule的问题,它在浏览器的html-view中工作(或多或少),但不能用作客户端的webDav-service(linux下的davfs或cadaver)。我的感觉是它与RewriteRule有关。

我想做什么:从URL-perspective:有一个文件夹/ users / 某人,其中某人是个人用户名。我希望有一个快捷方式/私有,它直接指向我有写访问权限的/ users / myusername 目录。 在文件系统中,我有/ storage / davroot用于DAV和DocumentRoot,/ storage / davusers用于所有用户目录。请注意,user-dirs不在DocumentRoot中,这使得它有点棘手。

我目前的解决方案是:

    # It's NOT working with the RewriteCond -- why?
    # RewriteCond %{LA-U:REMOTE_USER} ^[a-z].*
    RewriteRule ^\/private(.*)$ /users/%{LA-U:REMOTE_USER}$1 [PT]

   <Directory /storage/davroot/>
            # some settings for the rights, do not care
   </Directory>
   Alias /users /storage/davusers/
   <Directory "/storage/davusers/">
            # some other settings for the rights, also don't care
   </Directory>

什么是正确的:几乎整个浏览器视图都是正确的。除了一个问题:url / private /被正确列出,url栏保持/ private /(想要的行为)。但是url / private被转换为/ users / username /,并且url栏也会更改为此地址。为什么呢?

如果我使用webdav客户端(davfs)登录,该主题甚至会变得更加奇怪。私人文件夹为空,用户文件夹无法访问。使用尸体,私人文件夹无法访问,并且用户文件夹已正确显示。

1 个答案:

答案 0 :(得分:0)

这是一个坏主意。重写通常适用于“哑巴”#39; HTTP端点(如文件),但对于WebDAV,这会发生变化。

问题是WebDAV HTTP请求(例如PROPFIND)会返回包含网址的结果。这些网址必须与您用于访问资源的网址相匹配。

Apache的重写仅适用于传入的请求。它没有实时修改&#39;传出的xml响应以匹配所有内容。

在这种情况下要做的理智的事情是不重写,而只是重定向。并非每个客户都支持这一点,但至少您的服务器以可预测的方式工作,并且根据规范。

另一种可能性是使用像AliasMatch这样的东西,因为这个指令实际上用本地路径来做,而不仅仅是url。如果你可以让它工作,我想mod_webdav将继续以一种理智的方式运作。

但我不确定AliasMatch是否可以使用REMOTE_USER之类的标题。