我试图设置一个WebDAV服务器,它使用用户名redirect到一个私人的DAV目录。 在每个私人目录中还有一个名为SharedFolder的文件夹。
这个想法是,当用户login时,他将首先被redirect到他的私人目录。 使用重写模块,URL中将不会显示任何path,只会显示阻止用户进入另一个私人目录的主机名。 当用户打开名为SharedFolder的固定文件夹时,mod_rewrite将在匹配的RewriteCond文件夹名称上激发并redirect到RewriteMap中指定的相应共享文件夹。
我的虚拟主机configuration:
LoadModule dbd_module modules/mod_dbd.so LoadModule authn_dbd_module modules/mod_authn_dbd.so DBDriver mysql DBDParams "host=db.example.com user=username pass=password dbname=webdav" <VirtualHost *:80> Servername webdav.example.com DocumentRoot /var/www Options +FollowSymlinks RewriteLog "/var/log/httpd/rewrite.log" RewriteLogLevel 5 RewriteEngine on RewriteRule ^(.*) /webdav/%{LA-U:REMOTE_USER}$1 RewriteMap usergroup txt:/etc/httpd/usersingroups RewriteCond %{REQUEST_URI} ^/SharedFolder/ [NC] RewriteRule ^(.*)$ /sharedfolders/${usergroup:%{LA-U:REMOTE_USER}} [L] <Directory "/var/www"> DAV on Options +Indexes AuthName "example.com" AuthType Digest AuthDigestDomain / AuthDigestProvider dbd AuthDBDUserRealmQuery "SELECT digest FROM users WHERE username = %s AND unix_timestamp() < (ts+900) " Require valid-user </Directory> </VirtualHost>
RewriteMap的内容如下:
fred sales/indoor/ bob sales/outdoor/ alice production/warehouse
文件系统的布局全部在DocumentRoot / var / www下。 在/ var / www中有两个文件夹。 一个名为/ var / www / webdav,其中包含所有的私人目录。 另一个文件夹名为/ var / www / sharedfolders,其中包含属于不同组的目录。 通过在RewriteMap中定义path名,我可以确定用户SharedFolder中显示的是哪个组目录。
我面临的问题是redirect到SharedFolder不能正确工作。 用户私人目录中的每个文件或文件夹都是可访问和可用的。 除了SharedFolder 。 当我打开该SharedFolder时 ,我可以看到它的内容(这是一个txt文件和一个文件夹),但我无法打开该文件(这是我的桌面所说的)。 重写日志显示:
[webdav.example.com/sid#8ffd998][rid#9043870/initial] (2) rewrite '/webdav/fred/SharedFolder/Readme.txt/' -> '/sharedfolders/sales/indoor/' [webdav.example.com/sid#8ffd998][rid#9043870/initial] (2) local path result: /sharedfolders/sales/indoor/ [webdav.example.com/sid#8ffd998][rid#9043870/initial] (2) prefixed with document_root to /var/www/sharedfolders/sales/indoor/ [webdav.example.com/sid#8ffd998][rid#9043870/initial] (1) go-ahead with /var/www/sharedfolders/sales/indoor/ [OK]
当我读取重写日志时,它告诉我文件(Readme.txt)不会被重写到最后打开。
另一个问题是在SharedFolder中打开一个文件夹。 我不断地看到自己内部的SharedFolder的内容。 从WebDAV-disk: SharedFolder/folder a/folder a/folder a/folder a等等。 在每个“文件夹”里面,我也看到文件“Readme.txt”。 这是重写日志要说的:
[webdav.example.com/sid#8ffd998][rid#905d898/initial] (2) rewrite '/SharedFolder/bla/bla/bla/' -> '/webdav/fred/SharedFolder/bla/bla/bla/' [webdav.example.com/sid#8ffd998][rid#904b850/subreq] (2) init rewrite engine with requested uri /webdav/fred/SharedFolder/bla/bla/bla/ [webdav.example.com/sid#8ffd998][rid#904d858/subreq] (2) init rewrite engine with requested uri /webdav/fred/SharedFolder/bla/bla/bla/ [webdav.example.com/sid#8ffd998][rid#904d858/subreq] (2) rewrite '/webdav/fred/SharedFolder/bla/bla/bla/' -> '/webdav//webdav/fred/SharedFolder/bla/bla/bla/' [webdav.example.com/sid#8ffd998][rid#904d858/subreq] (2) local path result: /webdav//webdav/fred/SharedFolder/bla/bla/bla/ [webdav.example.com/sid#8ffd998][rid#904d858/subreq] (2) prefixed with document_root to /var/www/webdav/webdav/fred/SharedFolder/bla/bla/bla/ [webdav.example.com/sid#8ffd998][rid#904d858/subreq] (1) go-ahead with /var/www/webdav/webdav/fred/SharedFolder/bla/bla/bla/ [OK]
我相信我进一步了几步,但还不够远:-)
一些背景信息:我最初尝试使用符号链接与SharedFolder完成相同的目标,但是这与启用WebDAV(我无法得到它的工作)组合似乎是不可能的。
操作系统:RHEL5.8 Apache版本:2.2.3
提前致谢
更新与@Jenny_D的build议我做了一些改变。 我在这个问题的code部分更新了我当前的configuration。 我已经改变的事情:
RewriteRule ^(.*)$ /sharedfolders/${usergroup:%{LA-U:REMOTE_USER}}删除$ 1 [L] 。 <Directory "/var/www/webdav">更改为<Directory "/var/www">以便重写的path(/ var / www / sharedfolders)也启用DAV。 这个最后的改变(第3号)产生了很大的变化:我现在可以看到我早先放置的SharedFolder (没有WebDAV)的内容。
问题在这里:
RewriteRule ^(.*)$ /sharedfolders/${usergroup:%{LA-U:REMOTE_USER}}$1
你在做什么是捕捉URL中使用的目录,存储在$ 1,然后$ 1追加到行的末尾。 如果你没有附加URL的那部分,只要在最后删除$ 1即可。
要在共享文件夹规则之后停止重写,请将标志[L]添加到最后。
所以规则应该看起来像这样:
RewriteRule ^(.*)$ /sharedfolders/${usergroup:%{LA-U:REMOTE_USER}} [L]
我find了一个工作configuration。 我现在使用以下内容:
LoadModule dbd_module modules/mod_dbd.so LoadModule authn_dbd_module modules/mod_authn_dbd.so DBDriver mysql DBDParams "host=db.example.com user=username pass=password dbname=webdav" <VirtualHost *:80> Servername webdav.example.com DocumentRoot /var/www Options +FollowSymlinks RewriteLog "/var/log/httpd/rewrite.log" RewriteLogLevel 2 RewriteEngine on RewriteMap usergroup txt:/etc/httpd/usersingroups RewriteCond %{REQUEST_URI} !^/SharedFolder [NC] RewriteRule .? - [S=2] RewriteRule ^/SharedFolder/(.*)$ /sharedfolders/${usergroup:%{LA-U:REMOTE_USER}}$1 RewriteRule .? - [S=2] RewriteCond %{REQUEST_URI} !^/SharedFolder [NC] RewriteRule ^(.*)$ /webdav/%{LA-U:REMOTE_USER}$1 <Directory "/var/www"> DAV on Options +Indexes AuthName "example.com" AuthType Digest AuthDigestDomain / AuthDigestProvider dbd AuthDBDUserRealmQuery "SELECT digest FROM users WHERE username = %s AND unix_timestamp() < (ts+900) " Require valid-user </Directory> </VirtualHost>
我创build了一个if-then-else构造,如果需要应用某个条件,则通过跳过行。 除此之外,我还使SharedFolder的RewriteRule更具体。 这基本上做了伎俩。 之后我被stream量pipe理器(一个反向代理)设置了错误的脚,这个脚本将SSL卸载到这个主机(因此在<VirtualHost *:80> 。查看,上传和删除工作得很好,除了重命名。事实certificate,当你在WebDAV中重命名一个文件或文件夹时, 整个目的地标题被发送,而不是上传或删除文件或文件夹时的path。所以当你做某种forms的SSL-卸载。