我正在一个网站上工作,该网站基本上是一堆数据的文件存储库。
我需要人们能够遍历目录并通过WebDAV及其浏览器下载文件(即mod_autoindex)。
使用mod_autoindex和mod_dav可以正常工作。但我想使用mod_wsgi / Flask来自定义和提供目录列表页面,而不是使用Flask-AutoIndex插件提供相当不灵活的mod_autoindex。
问题是这似乎会干扰DAV请求。当我尝试连接DAV客户端时出现The URL contains extraneous path components. The resource could not be identified.
错误。
有没有办法让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标记有关,该标记被附加到请求路径。
/urs_test/files
的WebDAV请求在到达mod_dav时被修改为/usr/local/apache2/htdocs/urs_test/app.wsgi/files
。
所以我需要找到一种方法来有选择地将alias指令应用于某些HTTP方法(即PROPFIND)而不是其他方法(即GET)。
答案 0 :(得分:1)
过了一会儿回来,我发现了一些似乎有用的东西。
基本上,我使用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 repo的本地路径。由于mod_wsgi
仅抓取/endpoint
URI的请求,因此此请求永远不会到达Flask并直接转到mod_dav
。
接下来的4行抓取对特定文件的任何GET
请求,并将它们重定向到本地文件系统中该文件的特定位置。再一次,这个请求没有到达Flask。根据我的理解,让Apache直接提供文件比使用Flask更快。
因此结果是只有GET
对DAV repo中目录的请求才能使它成为mod_wsgi
,因此我可以构建一个漂亮的目录索引并通过Flask提供它。