这是我现在所拥有的
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 文件加载图像,但它显示了一个损坏的图像链接。
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)。但是,这不会像您建议的那样阻止“直接访问”?通过“直接访问”,我们的意思是直接在浏览器地址栏中输入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
脚本中,您需要执行以下操作(尽管这自然会与上述“禁止”此类请求的指令发生冲突):
RewriteRule (.+)\.(?:jpe?g|png|gif)$ /getAccess.php?image=$1 [NC,L]
在您的原始指令中, the$1
只是对文件扩展名(即“jpg”、“jpeg”、“png”等)的反向引用,这似乎不是本意。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句