这是我现在所拥有的
.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文件加载图像,但它向我显示了一个损坏的图像链接。
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]
在您的原始指令中,$1
是对文件扩展名的反向引用(即。"jpg"、"jpeg"、"png"等)这似乎不是本意。