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



这是我现在所拥有的

.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"等)这似乎不是本意。

最新更新