以下是我现在所拥有的
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com/.$ [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ /getAccess.php?image=$1 [NC,F,L]
<?php
$result = $_GET['image'];
?>
<img src="<?php echo $result; ?>.jpg">
当我尝试到达时:
http://www.example.com/10.jpg
它显示我无法访问403,这很好。但我的问题是当我试图达到:
http://www.example.com/getAccess.php?image=10
我尝试通过PHP文件加载图片,但它向我显示图片链接已损坏。
答案 0 :(得分:1)
RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com/.$ [NC] RewriteRule \.(jpg|jpeg|png|gif)$ /getAccess.php?image=$1 [NC,F,L]
这并没有将图像重写为PHP脚本(如标题所示),它只是阻止访问(这是你看到的403)。但是,这并不能阻止&#34;直接访问&#34;你似乎在暗示什么?通过&#34;直接访问&#34;,我们的意思是直接在浏览器地址栏中输入URL - 此时HTTP Referer为空并且您的指令未被处理(由第一个条件排除) )。它会阻止来自外部站点的直接链接(提供HTTP Referer传递),但基于HTTP Referer控制访问最多是不可靠的。
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com/.$ [NC]
要解决您的紧急问题,您可以尝试从上面 CondPattern 的末尾删除.$
。因为这将阻止所有不是单个字符的内部引用(这就是一切)。
要阻止访问您的图像文件,您可以将RewriteRule
指令更改为:
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F]
这与您发布的内容实际上相同。在您的指令中,/getAccess.php?image=$1
部分(即替换)只是被忽略 - 这就是F
标志的作用。在这种情况下,您只需使用连字符进行替换。
另一方面,要将重写图像文件的请求改写为/getAccess.php
脚本,您需要执行以下操作(尽管这与上述指令自然会发生冲突) &#34;禁止&#34;这样的请求):
RewriteRule (.+)\.(?:jpe?g|png|gif)$ /getAccess.php?image=$1 [NC,L]
在您的原始指令中,$1
只是对文件扩展名的反向引用(即&#34; jpg&#34;,&#34; jpeg&#34;,&#34; png&#34等等,这似乎不是意图。