【问题标题】:Is there a way for mod_wsgi/Flask and mod_dav to coexist?mod_wsgi/Flask 和 mod_dav 有没有办法共存?
【发布时间】:2015-12-21 09:30:54
【问题描述】:

我正在开发一个网站,该网站基本上是一堆数据的文件存储库。

我需要人们能够通过 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

所以我需要找到一种方法来选择性地将别名指令应用于某些 HTTP 方法(即 PROPFIND)而不是其他方法(即 GET)。

【问题讨论】:

    标签: python apache flask mod-wsgi webdav


    【解决方案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 存储库的本地路径。因为mod_wsgi 只获取/endpoint URI 的请求,所以这个请求永远不会到达Flask 并直接到达mod_dav

    接下来的 4 行抓取任何对特定文件的 GET 请求,并将它们重定向到本地文件系统中该文件的特定位置。再一次,这个请求没有到达 Flask。据我了解,让 Apache 直接提供文件比让 Flask 提供文件要快。

    所以结果是只有GET 对 DAV 存储库中目录的请求才能到达 mod_wsgi,所以我可以构建一个漂亮的目录索引并通过 Flask 提供它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 2013-05-26
      • 1970-01-01
      • 2013-06-27
      • 2022-01-04
      • 1970-01-01
      • 2015-01-07
      相关资源
      最近更新 更多