mod_wsgi/Flask 和 mod_dav 有办法共存吗?
Is there a way for mod_wsgi/Flask and mod_dav to coexist?
我在一个基本上是一堆数据的文件存储库的网站上工作。
我需要人们能够通过 WebDAV 和他们的浏览器(即 mod_autoindex)遍历目录和下载文件。
仅使用 mod_autoindex 和 mod_dav 即可正常工作。但我想使用 mod_wsgi/Flask 来自定义和提供目录列表页面,而不是相当不灵活的 mod_autoindex,使用 Flask-AutoIndex 插件。
问题是这似乎会干扰 DAV 请求。当我尝试连接 DAV 客户端时出现 The URL contains extraneous path components. The resource could not be identified.
错误。
有没有办法让 mod_wsgi 忽略所有 WebDAV-specific headers 的请求,以便 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
。
所以我需要找到一种方法来选择性地将别名指令应用于某些 HTTP 方法(即 PROPFIND)而不是其他方法(即 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/ [L]
RewriteCond %{REQUEST_URI} ^/endpoint/dav
RewriteCond %{REQUEST_METHOD} =GET
RewriteCond /local_path_to_dav_repo/ !-d
RewriteRule ^/endpoint/dav(.*) /local_path_to_dav_repo/ [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 提供它。
我在一个基本上是一堆数据的文件存储库的网站上工作。
我需要人们能够通过 WebDAV 和他们的浏览器(即 mod_autoindex)遍历目录和下载文件。
仅使用 mod_autoindex 和 mod_dav 即可正常工作。但我想使用 mod_wsgi/Flask 来自定义和提供目录列表页面,而不是相当不灵活的 mod_autoindex,使用 Flask-AutoIndex 插件。
问题是这似乎会干扰 DAV 请求。当我尝试连接 DAV 客户端时出现 The URL contains extraneous path components. The resource could not be identified.
错误。
有没有办法让 mod_wsgi 忽略所有 WebDAV-specific headers 的请求,以便 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
。
所以我需要找到一种方法来选择性地将别名指令应用于某些 HTTP 方法(即 PROPFIND)而不是其他方法(即 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/ [L]
RewriteCond %{REQUEST_URI} ^/endpoint/dav
RewriteCond %{REQUEST_METHOD} =GET
RewriteCond /local_path_to_dav_repo/ !-d
RewriteRule ^/endpoint/dav(.*) /local_path_to_dav_repo/ [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 提供它。