Apache/PHP 不显示图像

Apache/PHP 不显示图像

我在使用 Apache 和/或 PHP 时遇到了一个奇怪的问题,这让我很抓狂。在解释这个问题之前,我先介绍一下我对环境的了解。

环境

OS: Ubuntu SMP x84_64
Apache Version: 2.x
PHP Version: 4.4.9-nmm4

这是一个共享主机托管计划,所以我无法访问 shell。

问题

如果网站本身引用了图片,Apache/PHP 不会显示任何图片(<img src="..." />)。所有图片请求都返回 403“禁止访问”。但如果您复制所请求图片的路径并直接浏览,则图片会显示出来。完全没有问题。

因此我可以得出结论,该图像对于 Apache 是可以访问的。我确实使用了.htaccess文件:

# BEGIN s9y
DirectoryIndex /index.php

<Files *.tpl.php>
  deny from all
</Files>

<Files *.tpl>
  deny from all
</Files>

<Files *.sql>
  deny from all
</Files>

<Files *.inc.php>
  deny from all
</Files>

<Files *.db>
  deny from all
</Files>

# END s9y

AddHandler php4-cgi .php

正如您所见,没有任何与图像相关的内容。没有重写规则或类似的东西。

到目前为止我尝试过

到目前为止,我在 Google 上搜索了很多,发现了一些提示,建议设置指令EnableSendfileEnableMMAP离开可以提供帮助。我试过了,但什么也没发生。我猜我必须重新启动 Apache 才能使它们生效。但正如我之前所说,这是一个共享托管计划。我无法重新启动 Apache。

我希望有一个人可以帮助我 :)

解决方案

解决我的问题的方法很简单。正如两个答案所暗示的那样,问题在于热链接保护。奇怪的是,保护是在同一帐户中为另一个域的另一个项目中进行的。我从 .htaccess 文件中删除了热链接保护,现在它又可以正常工作了。

特别感谢 Igor。他和我在 irc 上解决了这个问题。这就是我将他的回答标记为我的问题的正确答案的原因。

答案1

重复我在 IRC 中提出的问题:错误日志到底说了什么?

嗯,呵呵。——在没有提供错误日志的情况下,我使用我的魔法来调试这个问题(Opera 的 Dragonfly)。我注意到,它确实完全一致。

除非直接调用,否则每个图像都会 403。

我尝试在命令行上进行重现,并成功实现这一点:

igalic@resix:~$ curl -H"Referer: http://www.example.org/" -i http://www.example.org/foobar.jpg
HTTP/1.1 403 Forbidden

由此我得出结论,存在一些热链接保护,显然使用了错误的 URL 作为 Referer。

答案2

您的错误描述让我认为您错误地配置了引荐来源匹配。添加引荐来源匹配以试图防止热链接以降低带宽成本并不罕见。空引荐来源通常是允许的,当然,您的网站也应该被允许。所有其他引荐来源通常会被拒绝。

似乎应该匹配您网站的正则表达式与您的网站不匹配。当您发出没有引荐来源的相同请求时,它会起作用。

由于您使用的是共享主机且没有 shell 访问权限,因此您可能需要向您的提供商咨询此事。询问他们是否有任何热链接保护,如果有,请他们检查它是否正常工作。

如果您想排除 .htaccess 文件存在问题的可能性,请尝试删除它或注释掉其中的部分内容,看看您的图片是否能正常显示。如果图片仍然不能显示,则问题不在于 .htaccess 文件。

相关内容