.htaccess将图像文件重写为php脚本 - >显示损坏的图像链接

时间:2017-06-16 20:11:08

标签: php apache .htaccess mod-rewrite

以下是我现在所拥有的

的.htaccess

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]

/getAccess.php

<?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文件加载图片,但它向我显示图片链接已损坏。

1 个答案:

答案 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等等,这似乎不是意图。