【问题标题】:.htaccess redirecting to a php file which uses header() will execute twice.htaccess 重定向到使用 header() 的 php 文件将执行两次
【发布时间】:2014-09-18 10:33:31
【问题描述】:

我正在使用 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”。这按预期工作。

现在,用 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() 将再次调用自己,为什么这不会永远持续下去,但只有两次? (在极少数情况下甚至 3 次,但我无法重现此)

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

【问题讨论】:

    标签: php apache .htaccess mod-rewrite redirect


    【解决方案1】:

    您没有指定您在哪个浏览器中进行了测试,但我猜测它是 Chrome,因为其他人也遇到过类似的问题。在 Chromium 错误跟踪器上有 this bug report,在 StackOverflow 上有 this answer

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

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

    看看这是否能解决任何问题。

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

    【讨论】:

    • 删除“内容处置”没有帮助,“内联”也没有改变任何东西。浏览器之间存在差异,我之前没有注意到:IE 只会发出一个请求,Firefox 会发出两个带参数的请求,而 Chrome 也会发出两个请求,但第二个请求缺少参数($a 和 $b是空的)!我发现这是因为 Chrome 正在请求 favicon.ico(它不存在),所以问题只存在于 Firefox 中 - 并且只有当我直接请求图像时,如果我使用 HTML 页面并使用相同的 URL在 img-tag 中,只有一个请求!
    • FF发过来的两个请求有区别吗?他们俩是一样的吗?至于 Chrome,您可能希望更改您的重写规则以避免当前的catch-all,并且只重写您感兴趣的请求。
    • 是的,请求完全相同。正如我发现的那样,它们只出现在 Firefox 中(甚至所有插件都会停用),并且只有在直接调用图像 URL 时,在图像标签的 src 属性中使用相同的 URL 时我只会收到一个请求。我开始认为这是一些非常奇怪的 Firefox-bug ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    相关资源
    最近更新 更多