我正在一个网站上工作,该网站基本上是一堆数据的文件存储库。
我需要人们能够遍历目录并通过WebDAV及其浏览器(即mod_autoindex)下载文件。
仅使用mod_autoindex和mod_dav可以正常工作。但是我想使用Flask-AutoIndex插件,使用mod_wsgi / Flask来定制和提供目录列表页面,而不是相当不灵活的mod_autoindex。
问题在于,这似乎会干扰DAV请求。我得到一个The URL contains extraneous path components. The resource could not be identified.
错误,当我尝试用DAV客户端连接。
有没有一种方法可以使mod_wsgi忽略具有WebDAV特定标头的所有请求,以便可以由mod_dav正确处理?
编辑:
这是我的Apache配置:
LoadModule dav_module modules/mod_dav.so LoadModule dav_fs_module modules/mod_dav_fs.so DavLockDB "/var/lib/urs_test/dav/DavLock" LoadModule wsgi_module modules/mod_wsgi.so WSGIScriptAlias / /urs_test/webdav_info /usr/local/apache2/htdocs/urs_test/app.wsgi WSGIDaemonProcess test processes=2 threads=15 WSGIProcessGroup test
<Directory /usr/local/apache2/htdocs/urs_test> AuthType UrsOAuth2 require valid-user Dav On Options +ExecCGI AddHandler cgi-script .cgi .pl </Directory>
另一个编辑:
所以我想我已经弄清楚这里发生了什么。它与WSGIScriptAlias标记有关,该标记将附加到请求路径。
的WebDAV请求在到达mod_dav时/urs_test/files
被修改为/usr/local/apache2/htdocs/urs_test/app.wsgi/files
。
因此,我需要找出一种选择性地将别名指令应用于某些HTTP方法(即PROPFIND)而不应用于其他HTTP方法(即GET)的方法。
过了一会儿再回到这个问题,我发现了一些似乎可行的方法。
基本上,我使用mod_rewrite重定向我不希望mod_wsgi / Flask处理的请求。
因此,如果我的Flask应用程序在下提供/endpoint
,并且我希望WebDAV存储库在下提供/endpoint/dav
,则我的配置是:
RewriteCond %{REQUEST_URI} ^/endpoint/dav
RewriteCond %{REQUEST_METHOD} ^(PROPFIND|OPTIONS|PROPPATCH)$
RewriteRule ^/endpoint/dav /local_path_to_dav_repo/$1 [L]
RewriteCond %{REQUEST_URI} ^/endpoint/dav
RewriteCond %{REQUEST_METHOD} =GET
RewriteCond /local_path_to_dav_repo/$1 !-d
RewriteRule ^/endpoint/dav(.*) /local_path_to_dav_repo/$1 [L]
WSGIScriptAlias /endpoint /my_wsgi_dir/flask.wsgi
<Directory /local_path_to_dav_repo>
Dav On
</Directory>
前3行捕获任何DAV特定的方法(目前为只读方法),并将其重定向到DAV存储库的本地路径。由于mod_wsgi
仅获取/endpoint
URI请求,因此该请求永远不会到达Flask并直接转到mod_dav
。
接下来的4行捕获GET
对特定文件的任何请求,并将它们重定向到本地文件系统中该文件的特定位置。再一次,此请求不会到达Flask。据我了解,Apache直接提供文件的速度要比Flask进行的更快。
因此,结果是只有GET
DAV存储库中的目录请求才到达该目录mod_wsgi
,因此我可以构建一个外观漂亮的目录索引并通过Flask服务。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句