【问题标题】:.htaccess: image not loading on webpage.htaccess:图片未加载到网页上
【发布时间】:2016-07-24 11:28:57
【问题描述】:

我正在使用 .htaccess 规则来防止直接访问图像目录。这是.htaccess代码

Deny from all

我把这个 .htaccess 文件放到图像目录中。

问题是当我尝试访问网页中的某些图像时,它给我的图像加载失败错误,或者您可以说图像不存在。

<img class="highlight-right wow animated" src="/img/spark.png" height="192" width="48" alt="">

我想拒绝直接访问它的人访问它,但至少它应该在网页上工作。

对此有任何建议。

编辑: 我试过这个规则

RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost/ [NC] 
RewriteRule \.(jpe?g|gif|bmp|png)$ - [F,NC]

RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost [NC] 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost.*$ [NC] 
RewriteRule \.(gif|jpg|png)$ - [F]

但由于网页上未显示图像,因此两者都无法正常工作。

【问题讨论】:

  • 那么你需要根据你的.htaccess中的referrer来制定一个条件规则。请注意,这远非完美,它可能会阻止真正的访问者,并且不会阻止其他人获得它,具体取决于他们客户的配置。
  • @JuliePelletier 感谢您的评论。我对.htaccess 不太熟悉。你能解释一下吗?
  • @CalculatingMachine 我会保留您的拒绝规则以阻止所有外部访问,但使用 PHP 在内部访问文件。看我的回答。

标签: php .htaccess


【解决方案1】:

您可以将.htaccess 设置为根据引荐来源阻止他们,如下所示:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yoursite.com [NC]
RewriteRule \.(jpg|png|gif)$ http://yoursite.com/errorImage.jpg [NC,R,L]

请注意,HTTP_REFERER 不可靠,因为它可以在客户端的浏览器中更改,但它是最简单和最有效的方法。

更强大的方法需要使用 cookie 或会话,但这会增加服务器负载并因此减少响应时间。

【讨论】:

  • 感谢您的回答。
  • 一个问题,如果我在目录中有多种类型的文件,那么我可以使用 * 吗?
  • 没有。我的回答设置了一个规则,如果引用者不为空且不是您的站点,则该规则将为图像文件(jpg、png 和 gif)提供 errorImage.jpg
【解决方案2】:

我想拒绝直接访问它的人访问它,但至少它 应该在网页上工作。

1..htaccess 中使用Deny from all 规则来阻止所有直接访问。

2. 更改您的图像源链接以引用负责返回正确图像的 PHP 脚本。

<img src="/path/to/images.php?f=spark.png">

注意我是如何在参数中传递图像名称的?这就是 PHP 将知道请求哪个图像的方式。在 images.php 中执行:

$IMG_DIR = '/path/to/images'; //put all protected images here

$img = $_GET['f']; //the file's name, matches the f= parameter in <img>

$img_path = $IMG_DIR."/$img";
if(!is_file($img_path)){ // make sure this image exists
    http_response_code(404); //404 not found error
    exit;
}

$extension = pathinfo($img,PATHINFO_EXTENSION); //eg: "png"
$mimetype = "image/$extension"; //type of image. browser needs this info
$size = filesize($img_path);

//tell the browser what to expect
header("Content-Type: $mimetype");
header("Content-Length: $size");

//send the file to the browser
readfile($img_path);

我不在这里这样做,但这种方法允许您根据需要限制访问。例如,您可以通过查看$_SESSION 的内容来测试用户是否已登录,然后再决定是否返回图像。

【讨论】:

  • 感谢您的回答。
猜你喜欢
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
相关资源
最近更新 更多