我遇到了将标题(位置:)作为从HTML表单POST到PHP_SELF的响应发送回来的问题。
用例的基本部分:
使这件事变得如此神秘的三件事:
额外的琐事:
我没有想法 - 有人可以为此提供方向吗?
这是一个简化的测试用例 - 有趣的是,它在dev中的行为与prod相同,所以至少它现在是一致的。
这是test.php:
<?php
if($_POST['submit']) {
Header('Location: ./upload.php');
} else {
echo
'<form name="test" action="'.htmlentities($_SERVER['PHP_SELF']).'" method="POST">
<input type=submit value=try name=submit>
</form>
<form name="test2" action="test2.php" method="POST">
<input type=submit value=try2 name=submit>
</form>';
}
?>
这里是test.php ......非常简单。
<?php
Header('Location: ./upload.php');
?>
这是upload.php的一个片段:
<!-- <div id="flashcontent"></div> -->
</fieldset><?php require_once('test.php'); ?></div></div>
</body>
</html>
今天的更新 - 实际上,简单测试用例的行为并不像我原先想的那样。我已经将真实文件包含在简单的测试用例包含上面,我认为这会导致经典的标题已经发送的问题。一旦我注释掉了真实文件,简单测试用例的行为现在与本文开头概述的原始案例相匹配。因此,如果从表单提交中的include中调用,则简单测试用例会加载标题,如果从包含文件中发布的另一个页面调用,则加载标题...没问题。但是,在生产中,只有在从发布到的页面调用时才会实现标头调用的结果,而不是在发布到php_self时调用。
<div class="panel_wrapper">
<div id="general_panel" class="panel currentmod">
<fieldset>
<legend><?php echo TB_UPLOADFILES; ?></legend>
<?php
//define('upload_opt',TRUE);
//require_once('upload_opt.php');
?>
<!-- <div id="flashcontent"></div> -->
</fieldset><?php require_once('test.php'); ?></div></div>
</body>
</html>
答案 0 :(得分:1)
可能是错误后发送标头。尝试在生产服务器上关闭错误。
同时检查标题之前是否没有输出空格。
Linux中的文件名区分大小写,因此请确保您的案例也是正确的。如果它找不到新的位置,那可以解决问题(虽然我对此表示怀疑,因为google.com无效。)
尝试在标题声明后添加“exit()”。
确保您的标头具有正确的语法,如果资源是外部的,则绝对是绝对的。
header("Location: http://www.google.com");
exit();
尝试在生产服务器上执行一个愚蠢的示例进行测试。完全删除帖子并确保标题重定向正常。如果您使用共享主机并且不能控制PHP.ini文件,则它可能是受限制的功能。
如果这些都不起作用,那么您的标题代码片段就会很有趣。
答案 1 :(得分:0)
不知何故,这一切都与输出顺序,缓冲和标题有关,最终使用输出缓冲(ob_start / ob_end_flush)解决。尽管输出缓冲在两个环境中设置相同(output_buffering:4096),但出于某种原因,我似乎正在享受Dev中的缓冲,我不在Prod中。通过将包含页面包装在ob_start()和ob_end_flush()中,现在两种环境中的行为都是一致的。
我对此并不感到兴奋,因为它似乎是一种解决方法,而且我仍然不清楚为什么两种环境中的行为不同。似乎更可靠的解决方案是不要POST到PHP_SELF来调用header(Location),而是POST到另一个调用header(Location)的文件。某处,可能写的是这是最佳做法,不要试图从内部调用header(Location),并避免使用输出缓冲。
如果有人想真正深入挖掘这个谜团,请随意contact me offline,因为我已经设法解决症状,但我仍然不知道问题是什么。