符号链接是 Linux 上一种广泛使用的做法,它使资源(例如目录)可在另一个位置使用,而无需维护它的多个副本。这在许多应用程序中都已实现,例如具有资源树和带有用户目录的树:每当用户打算使用某个资源时,都会将符号链接放入他或她有权访问的目录中。如果有足够的权限,他或她可以使用资源(在其中创建文件),而这些资源可能物理上写入不同的位置,例如在具有足够空间的设备上。如果用户使用 Samba 访问其主目录,则此方法可以正常工作。
但是,使用 WebDAV 也有充分的理由,端口问题就是其中之一。将此类应用程序移植到 WebDAV 时的问题:Apache 的 mod_dav 的编写方式不会暴露符号链接,无论是否设置了 FollowSymLinks。这种行为社区意图,因此错误报告从未被解决过。
但是,如何将所需的行为移植到 WebDAV?我尝试使用硬链接,但硬链接目录似乎根本不起作用。使用mount
可能有效,但我无法估计数百次挂载的副作用。有没有我现在还没想到的选项?有没有已知的“最佳实践”?或者 WebDAV 根本不适合替代 Samba?
答案1
这似乎就是mount --bind
我所寻找的解决方案。有理由支持和反对使用ln -s vs mount --bind,但在 Linux 系统上多次挂载一个设备似乎是一种常见的做法(甚至鼓励将单个文件挂载到其他文件上man mount
),而且系统稳定性似乎没有受到严重影响。
当然,唯一的缺点是,如果挂载点没有通过修改来修复/etc/fstab
,服务器重启后它们将会丢失。
关于 WebDAV 的更多内容:网上草案(目前已过期)扩展 WebDAV 规范以允许“高级集合”,这也应该提供处理链接的能力。大约在 1998-2002 年,人们花了很多精力解决这个问题,然后这个话题就悄无声息地消失了。你可能会在互联网上找到几个页面,声称WebDav 通过高级集合支持符号链接,但目前,不是这种情况. 当前(v.1.0.3-1.3.6)mod_dav
源代码内容如下:
/* ### for now, only process regular files (e.g. skip symlinks) */
if (S_ISREG(fsctx->info1.finfo.st_mode)) {
人们可能会认为Tomcat 6 的 WebDAV 模块可能不知道符号链接(因为,据我所知,在版本 7 之前,对这种文件系统特殊内容的认识并未纳入 Java 模型),但它表现出相同的行为,因此也符合规范。
最后,mod_dav-1.0.3-1.3.6 的符号链接补丁已经发布,但您必须将补丁应用到源代码上并自行编译模块...我没有尝试过。
答案2
DAV 协议不遵循符号链接
因此,使用 apache 配置文件来执行链接。
在文件系统上
mkdir /www/public_html/somewhere-else
(即 /somewhere-else 出现在 dav list-directory 命令中)
在 apache 配置中
Alias /somewhere-else /another-place
注意:如果 '/another-place' 位于网络服务器之外,请添加到 apache 配置中
<Directory /another-place>
Dav On
AllowOveride None # so .htaccess files are visible and their directives dont screw up dav
DirectoryIndex disabled # so dav's directory index command works
</Directory