使用 mod_rewrite 检查当前 PHP 会话,防止直接访问图像

使用 mod_rewrite 检查当前 PHP 会话,防止直接访问图像

我正在研究一个解决方案,以解决用户可能访问存储在服务器根目录外的文件夹中的图像(在本例中为 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}

相关内容