我正在使用PHP生成动态图像并使用.htaccess重定向到PHP脚本以在HTML-img-tags中使用这些图像,例如“/path/something.jpg”。
这是我的.htaccess:
RewriteEngine On
RewriteBase /
RewriteRule ^/?([a-z]+)/(.*)$ /?a=$1&b=$2 [L,NC]
我的index.php会在$ _GET ['a']和$ _GET ['b']中的“something.jpg”中收到“path”。这可以按预期工作。
现在,在使用PHP创建图像后,图像的输出完成如下:
header('Content-type: image/jpg');
header('Content-Disposition: filename="something.jpg"');
echo $binary;
exit;
这也有效,我收到一张图片,浏览器显示它。
但是:当每次调用index.php生成图片时都会写日志时,我看到每个正在创建的图像都被称为TWICE,我无法弄清楚原因。
似乎使用header()
会使脚本重新开始,因为从脚本中删除header()
(并且只打印$ binary)将导致脚本只执行一次。
apache-access.log也显示第二个调用:
127.0.0.1 - - [18/Sep/2014:12:17:46 +0200] "GET /path/something.jpg HTTP/1.1" 200 19148 "-" "USER_AGENT"
127.0.0.1 - - [18/Sep/2014:12:17:46 +0200] "GET /path/something.jpg HTTP/1.1" 200 19148 "-" "USER_AGENT"
我一直在试验.htaccess-settings以防止这种情况发生:
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]
在我的.htaccess文件中(如Apache mod_rewrite REDIRECT_STATUS condition causing directory listing所示),但无济于事。
我也想知道为什么这种行为不会导致无限循环:如果.htaccess将请求发送到index.php,它执行会再次调用自己的header(),为什么不会永远这样做,但只有两次? (在极少数情况下甚至三次,但我无法重现这一点)
非常感谢任何关于为什么会发生这种情况的提示(以及如何解决它!)。该脚本到目前为止工作,但我想阻止它生成每个图片两次,因为我预计一旦应用程序完成后会有大量的服务器负载。
答案 0 :(得分:1)
您没有指定您在此测试的浏览器中的哪一个,但我猜测它是Chrome的,因为其他人遇到了类似的问题。 Chromium bug跟踪器上有this bug report,StackOverflow上有this answer。
尝试仅移除Content-Disposition
标头,看看它是否在没有该设置的情况下正常工作。您还可以尝试在内容处置标题中指定INLINE
,如下所示:
header('Content-Disposition: INLINE; FILENAME= "something.jpg"');
并查看是否可以修复任何问题。
如果这些没有帮助,请尝试使用Web调试代理工具(如Fiddler或Charles)并发布两个请求的完整请求/响应标头。