通过使用mod_rewrite检查当前PHP会话来保护图像不受直接访问

我正在处理一个问题的解决scheme,用户可能会访问存储在服务器根目录下的文件夹(本例中为PDF文件)。 通常,我的应用程序通过PHP脚本和会话validation用户。 目前没有发生的事情是阻止未login的用户访问PDF文件。

我正在寻找的解决scheme(我认为)需要与Apache绑定。 我看到了一个有趣的解决scheme,使用RewriteMap&RewriteRule,但是这个例子涉及到将这个文件放到PDF目录的.htaccess文件中。 不能这样做与Apache(错误:RewriteMap不允许在这里)。 我相信重写指令需要在我有权访问的httpd.conf中。

所以我发现的例子(导致'rewritemap不允许在这里')在这里:

RewriteEngine On RewriteMap auth prg:auth.php RewriteRule (.*) ${auth:$1} 

auth.php只是检查PHP会话,并根据需要redirect到login脚本。

我正在阅读,我必须把它放在我的httpd.conf。 我如何指定RewriteMap应该只出现在一个特定的目录(包括子目录)?

我可能会使用RewriteRule而不是RewriteMap来处理它。 创build一个将pdf请求redirect到php文件的mod_rewrite规则

 RewriteEngine on RewriteRule ^(.*\.pdf)$ /path/to/auth.php?i=$1 

然后你可以让auth.phpvalidation会话并吐出PDF文件的实际内容。 我使用RewriteRule和jpg文件做了同样的事情。

 RewriteRule ^([^thumb].*\.[jJ].*)$ /auth.php.php?i=$1 

然后,我使用auth.php根据会话和其他因素修改图像,然后将其吐出到客户端。 例如:

 $last_modified = gmdate('D, d MYH:i:s T', filemtime ($image)); header("Last-Modified: $last_modified"); header("Content-Type: image/jpeg"); imagejpeg($image,NULL,95); 

你也可以做一些很酷的事情,比如在图像上添加一个独特的水印和其他任何你想要的处理,并且我怀疑在PDF文件中使用了写入function。

你可以在<Location /directory>块(如果你想匹配一个URI)或者一个<Directory /var/www/html/directory>块(如果你想匹配一个文件系统path)中包装这些指令。

或者你可以改变RewriteRule的模式部分,只匹配你想要的URIpath:

 RewriteRule (^/directory.*) ${auth:$1}