Apache2 - 仅允许在 WebDAV 中访问 .pdf 和索引

Apache2 - 仅允许在 WebDAV 中访问 .pdf 和索引

我已经使用 apache2 设置了WebDAV它,以便与 Zotero 一起使用。由于我们只想通过此 webdav 上传和下载 pdf,因此我想阻止上传或下载除 pdf 文件之外的任何其他文件。为此,我使用了:

<Location *>
        AuthType Basic
        AuthName DAV
        AuthUserFile "*"
        Require valid-user
        RewriteEngine On
        RewriteRule !(\.pdf)$ - [F,NC] # only allow access to pdf to prevent misuse
</Location>

这在 Zotero 检查您是否有权访问 DAV 之前都很好,它会通过调用基本 URL 来检查,例如bla.com/zotero。使用此配置,用户不得访问 DAV 索引。我需要如何更改我的RewriteRules才能仅允许 pdf 文件和目录索引?我尝试添加RewriteCond %{REQUEST_FILENAME} !-d和一些其他内容,但没有用,索引仍然为 403。

由于我们的设置,该FilesMatch指令似乎不起作用,所以我们RewriteRules现在必须坚持下去。

非常感谢你的帮助!

答案1

我已尝试添加RewriteCond %{REQUEST_FILENAME} !-d...

服务器(或 vHost)上下文中的指令执行请求已映射到文件系统,因此REQUEST_FILENAME服务器变量尚不包含 URL 映射到的文件系统路径(它仅包含 URL)。

要检查服务器上下文中的文件系统路径(无论它映射到文件还是目录),您需要使用前瞻。请尝试以下操作:

RewriteCond %{LA-U:REQUEST_FILENAME} !-d
RewriteRule !(\.pdf)$ - [F,NC,NS]

注意:请小心行尾注释;Apache 不支持它们。

NS指令上的( nosubreq) 标志是RewriteRule防止子请求被阻止所必需的。当 mod_autoindex 生成目录列表时,它还会对目录中的每个文件发出额外的子请求,以获取文件大小和上次修改的时间戳等。您需要防止您的 mod_rewrite 检查在这些子请求上被触发。

更新:使用 NS 标志和没有lookahead,它似乎有效!但为什么会这样呢?正如您所解释的那样,lookahead 应该是必要的吗?

如果这些指令实际上位于<Directory><DirectoryMatch>容器内(换句话说,它们位于目录上下文,与相同.htaccess),那么您将需要使用普通的REQUEST_FILENAME服务器变量,而无需前瞻。

这似乎也与您在服务器日志中看到的输出一致。

相关内容