手机App访问不了自己架设的WEBDAV服务器?
非也,这是webdav服务器没正确配置的锅。
很多人在用IIS搭建webdav的时候,认为在站点根目录上启用webdav服务,并对其下虚拟目录开启了目录浏览,能够在浏览器上成功浏览虚拟目录中的文件便是成功。
其实那只是目录浏览功能而已,开不开无所谓,跟webdav完全两码事。
正确的做法,需要在网站根目录启用webdav服务(重中之重)。
然后在webdav创作规则中添加自己的用户,授予读写权限(重中之重之重中之重)。
确保作为webdav共享的虚拟目录上,处理程序映射中有webdav模块,并且其请求限制中的谓语一项内正确填写了webdav特殊定义的谓语。
确保授权规则一项中能够允许自己的用户访问该目录。
确保身份验证一项中启用windows验证。
如果webdav根目录下想要包含别的虚拟目录,而这些目录是磁盘根目录的话会出现迷之权限问题,解决方法是使用mklink /D 命令建立目录链接,IIS能够很好地识别它们。
然后你就能够在solid explore或者windows explore一类的客户端中映射你的webdav服务器了。实测这两个支持,而fx explore不支持,es大流氓就不清楚了。
这种设置登录需要windows本地账户,某些APP可能不支持windows认证,但更多APP不支持别的认证,实在很难平衡。有技术的话可以写个 http:// asp.net 模拟认证。
此外你也可以尝试下匿名认证。
还有一点需要注意的是某些客户端中对文件的复制操作使用的谓语是get而非webdav的copy,get默认处理映射是静态文件处理程序,对于MIME中没有定义的奇葩后缀的文件会直接操作失败,解决办法要么换个正常的客户端(几乎没有),要么先把后缀改了再传。
附完整步骤:
——————
1 环境准备
1.1 windows功能中启用IIS-万维网服务-常见HTTP功能-webdav发布、静态内容,其他可以不管。
1.2 启用IIS-万维网服务-安全性-windows身份验证,或者基本身份验证。这里推荐windows身份验证,因为基本身份验证是明文传输登录密码的,而且很多客户端都不支持基本身份验证。
1.3 启用IIS-web管理工具-IIS管理控制台。成功启用后开始菜单中会出现IIS管理器。
2 网站搭建
2.1 从开始菜单中打开IIS管理器
2.2 建立站点,或者配置默认站点。
这里选择建立一个新的站点,右击左侧导航栏中的网站,添加站点,输入站点名称并选择物理路径。
这里的站点名为ShareOnLan,物理路径则建立在C:\inetpub\ShareOnLan。这个路径随意,但需要提前建好文件夹。选定后就是该站点的根目录。
在下拉菜单中给站点绑定一个IP地址,点击确定启用该网站。
2.3 为该站点启用webdav服务,设置全部保持默认,只用单击启用就可以了。
2.4 右击左侧导航栏中的网站,为站点添加虚拟目录,这里的虚拟目录是C:\inetpub\ShareOnLan\webDAV,提前建好,它是webDAV共享的根目录,如果想要在根目录下写文件记得在安全选项卡中为该目录赋予登录用户的读写权限。
传递身份验证照样保持默认值。
2.5 为该虚拟目录添加webDAV创作规则,此规则将用来检验用户是否有资格访问webDAV服务。
右击空白处,选择添加创作规则,如下图,注意红框内部分。用户名需要windows本地用户名,纯粹的outlook用户名需要先转化为本地用户。
2.6 授予用户访问该站点的权限。
右击空白,确保自己拥有访问该虚拟目录的权限,默认从站点继承所有用户都能访问。为了安全性可以设置为仅对指定角色和用户组,然后删掉站点对所有人的访问授权。总之,确保自己用来登录webDAV的用户有权访问这个目录。
2.7 身份认证,确保启用,并且仅启用windows身份验证。匿名验证大多数时候也能正常使用,但windows验证和基本验证两种验证方式在大多数客户端中都存在冲突,所以请在webDAV能够访问后再根据自己的需求酌情更改此项设置。
3 测试webDAV服务
3.1 在资源管理器中添加网络位置,注意斜线方向,此外多次输错密码(大多数时候为认证方式有误)后该IP地址会无法映射,临时解决方法为修改hosts文件给ip地址套个别名。
3.2 测试写入权限
这是由于该webDAV服务的根目录设置在系统驱动器上,指定的用户默认没有继承到写入权限。
解决方法:安全选项卡中赋予写入权限,不过不建议这样做,根目录只用来放子目录就可以了。或者当初设置webDAV的虚拟目录时,就可以直接选在其他盘符。
3 优化
3.1 为webDAV建立目录链接
想要让一个目录作为子目录在webDAV中出现,有三种方法。
要么它本身就在webDAV根目录的物理路径之下,但这同样涉及权限继承问题,而且很不灵活。
要么通过IIS管理器在webDAV虚拟目录下继续创建下级虚拟目录,但IIS管理器中无法映射驱动器根目录为虚拟目录,这显然不符合很多使用情境下的需求。
那么最好的选择便只有建立目录符号链接了。
管理员身份启用CMD命令行,执行以下命令,即可为驱动器D:\在C:\inetpub\ShareOnLan\webDAV\下面建立一个名为[D]的目录链接:
mklink /D C:\inetpub\ShareOnLan\webDAV\[D] D:\
其中第一个/D参数代表建立的链接类型为目录链接,第二个参数为想要建立的链接地址,第三个是链接到的目标路径。
但是你会发现,这个[D]有些半透明?因为它现在在windows下是个迷之隐藏文件夹,但请放心,在其他客户端下面它会好端端地显示出来。
3.2 webDAV设置,使其支持隐藏文件的浏览与无限深度属性查询。
3.3 修改webDAV允许传输的文件大小上限,以及缓存容量。
展开到system.webServer/asp(尤其注意,asp上面有个webdav,但是两者是同级,不要点错点进webdav的子项里),进入limits子项。
3.4 在站点下建立另一个虚拟目录,其下为需要共享的路径分别建立次级虚拟目录,并启用目录浏览。
如果不使用网络浏览器直接浏览文件,则无需此步操作。
3.5 简单的基于webdav协议的文件修改脚本。
代码:
javascript:!function(){var t=document.getElementsByTagName("head")[0],e=function(e,s){var a=document.createElement("script");a.src=e,a.type="text/javascript",s&&(a.onload=s),t.appendChild(a)},s=function(e){var s=document.createElement("link");s.href=e,s.rel="stylesheet",t.appendChild(s)};e("https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js",function(){["https://cdn.rawgit.com/noelboss/featherlight/1.7.1/release/featherlight.min.js","https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?autorun=false","https://cdn.rawgit.com/notifyjs/notifyjs/master/dist/notify.js","https://cdn.rawgit.com/noelboss/featherlight/1.7.1/release/featherlight.min.css","https://cdn.rawgit.com/dom111/webdav-js/master/assets/css/style-min.css","https://cdn.rawgit.com/dom111/webdav-js/master/src/webdav-min.js"].forEach(function(t){t.match(/css$/)?s(t):e(t)})})}()
将上述代码保存为书签,然后在使用浏览器浏览webdav服务器上的静态文件时点击该书签,则浏览器会加载对应的js代码以支持简单的文件修改操作。实测修改有问题,但可以在启用了webdav却不支持目录浏览的路径上正常浏览文件。
该书签js工具来源于github开源项目,链接如下:
——————
好了,大功告成。
——————
再说一次,某些webdav客户端使用的谓语不标准,可能造成请求走静态文件处理程序的情况,然后就是MIME中没有的文件类型无法传输。
遇到这种情况最简单的办法就是暂时给它改个后缀,传完了改回来。