先来了解一下百度百科关于WebDav(Web-based Distributed Authoring and Versioning)的解释
一种基于 HTTP 1.1协议的通信协议.它扩展了HTTP 1.1,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可直接对Web Server直接读写,并支持写文件锁定(Locking)及解锁(Unlock),还可以支持文件的版本控制。
下面来看如何实现文档的协同管理
1安装软件及模块一览
(1)Apache2.2.14 自己下载编译。未用ubuntu 9.10 server 下apt-get安装的apache2 是因为这个版本的apache2在启用ssl的时候总是报undefined symbol apr_ldap_ssl_init错误,此处我怀疑可能是ubuntu9.10 server的问题,我在虚拟机ubuntu 8.04 desktop下配置成功。
2 加载Dav Module
在对Apache进行编译时已经开启了dav的设置(具体参见Ubuntu 9.10 Server 配置基于SSL的Subversion,svn需要webdav协议支持)
#sudo ./configure –enable-dav –enable-dav-fs –enable-so –enable-ssl –enable-maintainer-mode -prefix=/usr/local/apache2 –enable-mods-shared=all
注意enable-dav和enable-dav-fs是我们文档协同所需要的。我们可以通过
cd /usr/local/apache2/bin sudo ./httpd -l
来查看已加载的Module。另外自主编译的方式无法通过修改httpd.conf,加入
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
来完成,modules文件夹下也没有这两个so文件,启动apache后会报文件已加载,我搞了很长时间才明白这点。
3 配置WebDav
在httpd.conf文件下 将#Include conf/extra/httpd-dav.conf的注释去掉,我们来看一下httpd-dav.conf的配置
DavLockDB "/usr/local/apache2/var/DavLock"
Alias /uploads "/usr/local/apache2/uploads"
<Directory "/usr/local/apache2/uploads">
Dav On
Options Indexes FollowSymLinks
Order Allow,Deny
Allow from all
AuthType Basic
AuthName DAV-upload
Require valid-user
# You can use the htpasswd program to create the password database:
# htpasswd -c "/usr/local/apache2/user.passwd" DAV-upload admin
AuthUserFile "/svn/authfile"
<Limit GET OPTIONS PUT POST DELETE PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
</Limit>
</Directory>
注意一定是Allow from all 另外我使用了Basic的验证方法,要求用户验证;这里Subversion和WebDav使用的是同样的用户文件;Options Indexes FollowSymLinks允许我们在浏览器访问时遍历文件。
4 权限
#cd /usr/local/apache2
#sudo mkdir uploads
#sudo chown www-data:www-data uploads
#sudo chmod 777 uploads
以上创建上传目录并设置权限为可读可写 www-data为ubuntu的用户和组
另外可能需要手动创建 DavLockDB
#cd /usr/local/apache2
#sudo mkdir var
#cd var
#sudo vim DavLock
#cd ..
#cd ..
#sudo chown www-data:www-data uploads
#sudo chmod -R 777 var/
5 WebDav客户端
分别使用了XP和Vista自带的web folder
使用方法,在XP的资源管理器下选择增加网上邻居(Vista为添加一个网络位置)输入http://your ip or sitename/uploads 并输入用户名和密码。然后再word里就可以直接对文件进行增加修改了,而且当一个用户在更改的时候,其他用户只能只读访问。
当一个用户打开某文件,会加一个只读锁,其他的用户打开该文件时提示
最后附上fiddler抓到的http包,(webdav协议是http协议的扩展,所以可以观察到)
HTTP/1.1 207 Multi-Status
Date: Tue, 01 Jun 2010 08:30:34 GMT
Server: Apache/2.2.14 (Unix) mod_ssl/2.2.14 OpenSSL/0.9.8g DAV/2 SVN/1.6.2
Content-Length: 966
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/xml; charset="utf-8"
<?xml version="1.0" encoding="utf-8"?>
<D:multistatus xmlns:D="DAV:">
<D:response xmlns:lp1="DAV:" xmlns:lp3="http://subversion.tigris.org/xmlns/dav/" xmlns:lp2="http://apache.org/dav/props/">
<D:href>/uploads/blackjack/Post.doc</D:href>
<D:propstat>
<D:prop>
<lp1:resourcetype/>
<lp1:creationdate>2010-06-01T06:11:10Z</lp1:creationdate>
<lp1:getcontentlength>46080</lp1:getcontentlength>
<lp1:getlastmodified>Tue, 01 Jun 2010 06:11:10 GMT</lp1:getlastmodified>
<lp1:getetag>"23a06-b400-487f1d6fea216"</lp1:getetag>
<lp2:executable>F</lp2:executable>
<D:supportedlock>
<D:lockentry>
<D:lockscope><D:exclusive/></D:lockscope>
<D:locktype><D:write/></D:locktype>
</D:lockentry>
<D:lockentry>
<D:lockscope><D:shared/></D:lockscope>
<D:locktype><D:write/></D:locktype>
</D:lockentry>
</D:supportedlock>
<D:lockdiscovery/>
<D:getcontenttype>application/msword</D:getcontenttype>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
</D:multistatus>