Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess重定向到使用header()的php文件将执行两次_Php_Apache_.htaccess_Mod Rewrite_Redirect - Fatal编程技术网

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

.htaccess重定向到使用header()的php文件将执行两次,php,apache,.htaccess,mod-rewrite,redirect,Php,Apache,.htaccess,Mod Rewrite,Redirect,我使用PHP生成动态图像,并使用.htaccess重定向到PHP脚本,以在HTML img标记中使用这些图像,例如“/path/something.jpg” 这是我的.htaccess: RewriteEngine On RewriteBase / RewriteRule ^/?([a-z]+)/(.*)$ /?a=$1&b=$2 [L,NC] 这将使我的index.php在$\u GET['a']中接收“path”,在$\u GET['b']中接收“something.jpg”。这正

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

这是我的.htaccess:

RewriteEngine On
RewriteBase /
RewriteRule ^/?([a-z]+)/(.*)$ /?a=$1&b=$2 [L,NC]
这将使我的index.php在$\u GET['a']中接收“path”,在$\u 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文件中(如此处所示:),但没有用

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


任何关于为什么会发生这种情况(以及如何解决它!)的提示都是非常感谢的。到目前为止,该脚本仍能正常工作,但我希望阻止它生成每幅图片两次,因为我预计应用程序完成后会有大量服务器负载。

您没有指定测试该脚本的浏览器,但我猜它是Chrome,因为其他人也遇到过类似的问题。Chromium bug tracker和StackOverflow上都有

尝试仅删除
内容处置
标题,并查看在没有该设置的情况下它是否正常工作。您还可以尝试在内容处置标题中指定
内联
,如下所示:

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

看看能不能解决什么问题


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

删除“内容处置”没有帮助,同时“内联”也没有改变任何内容。浏览器之间存在差异,我以前没有注意到:IE只会发出一个请求,Firefox会发出两个带参数的请求,Chrome也会发出两个请求,但第二个请求缺少参数($a和$b为空)!我发现这是因为Chrome正在请求favicon.ico(它不在那里),所以问题只存在于Firefox中——而且只有当我直接请求图像时,如果我使用HTML页面并在img标记中使用相同的URL,那么只有一个请求!FF发送的两个请求之间有什么区别吗?它们都一样吗?至于Chrome,您可能希望修改您的重写规则,以避免当前的
catch all
,而只重写您感兴趣的请求。是的,请求完全相同。正如我发现的,它们只出现在Firefox中(甚至所有插件都会被停用),并且只有在直接调用图像URL时,当在图像标记的src属性中使用相同的URL时,我才会收到一个请求。我开始觉得这是一个非常奇怪的Firefox bug。。。