我正在研究一个解决方案,以解决用户可能访问存储在服务器根目录外的文件夹中的图像(在本例中为 PDF 文件)的问题。通常,我的应用程序通过 PHP 脚本和会话来验证用户。目前没有发生的是阻止未登录的用户可能访问 PDF。
我正在寻找的解决方案(我认为)需要与 Apache 绑定。我看到了一个使用 RewriteMap 和 RewriteRule 的有趣解决方案,但是示例涉及将其放入 PDF 目录中的 .htaccess 文件中。无法使用 Apache 执行此操作(错误:此处不允许使用 RewriteMap)。我相信重写指令需要放在我可以访问的 httpd.conf 中。
因此,我找到的示例(导致“此处不允许重写映射”)在这里:
RewriteEngine On
RewriteMap auth prg:auth.php
RewriteRule (.*) ${auth:$1}
auth.php 仅检查 PHP 会话并在需要时重定向到登录脚本。
我读到我必须将其放在我的 httpd.conf 中。我该如何指定 RewriteMap 只应出现在特定目录(包括子目录)上?
答案1
我可能会使用 RewriteRule 而不是 RewriteMap 来处理它。创建一个 mod_rewrite 规则,将 pdf 请求重定向到 php 文件
RewriteEngine on
RewriteRule ^(.*\.pdf)$ /path/to/auth.php?i=$1
然后,您可以让 auth.php 验证会话并输出 PDF 文件的实际内容。我使用 RewriteRule 和 jpg 文件执行了同样的操作。
RewriteRule ^([^thumb].*\.[jJ].*)$ /auth.php.php?i=$1
然后我使用 auth.php 根据会话和其他因素修改图像,然后将其返回给客户端。例如:
$last_modified = gmdate('D, d M Y H:i:s T', filemtime ($image));
header("Last-Modified: $last_modified");
header("Content-Type: image/jpeg");
imagejpeg($image,NULL,95);
您还可以做一些很酷的事情,比如添加独特的水印以及在图像上进行任何其他处理,我怀疑还可以使用 PDF 文件的写入功能。
答案2
您可以将这些指令包装在一个<Location /directory>
块中(如果您想匹配 URI)或一个<Directory /var/www/html/directory>
块中(如果您想匹配文件系统路径)。
或者您可以只更改模式部分RewriteRule
以仅匹配您想要的 URI 路径:
RewriteRule (^/directory.*) ${auth:$1}