.htaccess重定向到使用header()的php文件将执行两次


.htaccess redirecting to a php file which uses header() will execute twice

我正在用PHP生成动态图像,并使用.htaccess重定向到PHP脚本,以便在HTML img标记中使用这些图像,例如"/path/something.jpg"。

这是我的.htaccess:

RewriteEngine On
RewriteBase /
RewriteRule ^/?([a-z]+)/(.*)$ /?a=$1&b=$2 [L,NC]

这将使我的index.php在$_GET[‘a']中接收"path",在$_GET[‘b']中收到"something.jpg"。这是意料之中的事。

现在,在用PHP创建图像后,图像的输出如下所示:

header('Content-type: image/jpg');
header('Content-Disposition: filename="something.jpg"');
echo $binary;
exit;

这也工作,我收到一个图像,浏览器显示它

但是:在编写日志时,每当调用index.php生成图片时,我都会看到它对正在创建的每个图像都被调用两次,我不知道为什么。使用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设置来防止这种情况发生,使用:

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

在我的.htaccess文件中(如下所示:导致目录列表的Apache mod_rewrite REDIRECT_STATUS条件),但没有用。

我还想知道为什么这种行为不会导致无休止的循环:如果.htaccess将请求发送到index.php,后者执行一个将再次调用自己的header(),为什么这种情况不会永远持续下去,而只会持续两次?(在极少数情况下,甚至三次,但我无法复制)

任何关于为什么会发生这种情况(以及如何解决!)的提示都将不胜感激。到目前为止,这个脚本是有效的,但我想防止它生成每个图片两次,因为我预计应用程序完成后会有大量的服务器负载。

你没有指定你在哪个浏览器中测试过这个,但我猜它是Chrome浏览器,因为其他人也遇到过类似的问题。Chromium错误跟踪器上有这个错误报告,StackOverflow上有这个答案。

试着只删除Content-Disposition标头,看看它在没有该集合的情况下是否正常工作。您也可以尝试在您的内容处置标头中指定INLINE,如下所示:

header('Content-Disposition: INLINE; FILENAME= "something.jpg"');

看看这是否能解决问题。

如果这些都没有帮助,请尝试使用web调试代理工具(如Fiddler或Charles),并为这两个请求发布完整的请求/响应标头。