我遇到了一个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)登录,该主题甚至会变得更加奇怪。私人文件夹为空,用户文件夹无法访问。使用尸体,私人文件夹无法访问,并且用户文件夹已正确显示。
答案 0 :(得分:0)
这是一个坏主意。重写通常适用于“哑巴”#39; HTTP端点(如文件),但对于WebDAV,这会发生变化。
问题是WebDAV HTTP请求(例如PROPFIND
)会返回包含网址的结果。这些网址必须与您用于访问资源的网址相匹配。
Apache的重写仅适用于传入的请求。它没有实时修改&#39;传出的xml响应以匹配所有内容。
在这种情况下要做的理智的事情是不重写,而只是重定向。并非每个客户都支持这一点,但至少您的服务器以可预测的方式工作,并且根据规范。
另一种可能性是使用像AliasMatch
这样的东西,因为这个指令实际上用本地路径来做,而不仅仅是url。如果你可以让它工作,我想mod_webdav将继续以一种理智的方式运作。
但我不确定AliasMatch
是否可以使用REMOTE_USER
之类的标题。