我在使用 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 上搜索了很多,发现了一些提示,建议设置指令EnableSendfile
并EnableMMAP
离开可以提供帮助。我试过了,但什么也没发生。我猜我必须重新启动 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 文件。