我正在创建一个web文件管理器,最近有人建议我在上面实现WebDav,我认为这是一个非常好的主意。
我想保持webdav在一个单独的URL像/webdav
,但现在我正在考虑保持我创建的web界面和webdav服务器在相同的URL。
为了知道我是否应该提供一个HTML页面或文件,我需要知道它是否正在从浏览器或从webdav服务器访问。我怎么知道?User-Agent是否足够?
如果是,我应该把哪些用户代理当作WebDav客户端?
谢谢!
您可能会使用像Authenticated vs unauthenticated这样的东西来确定,但正如@evert所说,不要这样做。同时阅读DAV规范(RFC 2518) (http://www.webdav.org/specs/rfc2518.html)
在没有分布式创作功能的情况下,没有源资源到URI的映射是可以接受的名称空间。实际上,阻止对源资源的访问具有理想的安全效益。但是,如果远程编辑源代码资源是必需的,源资源应该被赋予一个URI名称空间中的位置。这个源位置不应该是一个生成的输出可在哪些位置检索,因为一般来说,服务器不可能区分请求对于来自流程输出资源请求的源资源。在那里源资源和之间是否经常存在多对多关系输出资源。
这里重要的部分是
此源位置不应该是可检索>生成输出的位置之一,因为通常>服务器不可能区分对源资源的请求和对>流程输出资源的请求
不要这样做。一般来说,使用User-Agent
来确定服务器将表现出的行为是一个坏主意,对WebDAV来说也是一个坏主意。一些客户端使用多个用户代理,一些客户端使用非常通用的(curl)代理,而另一些客户端根本不提供用户代理。它使您的系统脆弱,容易出错和非标准,因为我不能仅仅构建WebDAV客户端并期望它工作,除非我模仿公认的用户代理之一。
话虽如此……你仍然可以避开User-Agent
。WebDAV使用PROPFIND
HTTP方法,您可以使用它来准确地确定WebDAV客户端是否正在连接。
GET
和PUT
来获取和存储文件,并且必须在严格的WebDAV层次结构中构建系统。如果您现有的url结构已经1:1匹配文件系统层次结构,那么这可能有效。
在某些方面,你只是建立一个WebDAV服务器,然后只有html索引的集合,这实际上是有些常见的。
最后,考虑使用库而不是自己编写库。
来源:我是一个流行的webdav框架的作者。