此问题已在此处有答案:
How to fix "Headers already sent" error in PHP(16个回答)
9年前关闭。
include 'header.php';
// ... some code
header('Location:index.php');
exit;
上面的代码一直给我一个重定向的问题。错误如下:
警告:无法修改标题信息-标题已经发送(输出开始于/Applications/MAMP/htdocs/testygubbins/OO/test/header.php:15)in/Applications/MAMP/htdocs/testygubbins/OO/test/form.php on line 16.
我该怎么做才能让它工作?
header.php代码:
<?php
include 'class.user.php';
include 'class.Connection.php';
$date = date('Y-m-j');
?>
<html>
<head>
<link rel=StyleSheet href="css/style.css" type="text/css" media=screen>
<title>Test</title>
</head>
<body>
<div id="page">
9条答案
按热度按时间vtwuwzda1#
仔细看看你的包括-也许你有一个空白行后,关闭?>?
这将导致一些文本空白作为输出发送,阻止您进行后续的头调用。
注意离开关闭是法律的吗?>关闭包含文件,这是避免这个问题的一个有用的习惯用法。
最后,正如PHP manual page for header所指出的,你真的应该使用完整的URL来重定向:
注意:HTTP/1.1需要一个绝对URI作为 Location: 的参数,包括方案、主机名和绝对路径,但有些客户端接受相对URI。你通常可以使用$SERVER
HTTP_HOST '],$_SERVER_
PHP_SELF']和dirname()从一个相对的URI创建一个绝对的URI:uubf1zoe2#
或者,不考虑文件中的某个地方的换行符或空格,您可以缓冲输出。基本上,在文件的开头调用
ob_start()
,在文件的结尾调用ob_end_flush()
。您可以在php.net ob-start function description找到更多信息。**编辑:**如果使用缓冲,可以在header()函数之前和之后输出HTML-缓冲将忽略输出,只返回重定向头。
hpxqektj3#
试试这个:
qlfbtfca4#
如果我理解正确的话,已经从header.php发送了一些东西(可能是一些HTML),所以头已经被设置了。您可能需要重新检查您的header.php文件中的任何可能输出HTML或空格的部分,然后才能首次
**编辑:**我现在确定它是由header.php引起的,因为你有那些HTML输出。您可以通过删除“include('header.php');“行,并将下面的代码复制到文件中。
hsvhsicv5#
你可能在php文件中的某个地方有一些“纯文本”被解释为脚本输出。它甚至可以是php脚本标记说明符之前或之后的一个换行符(小于+问号+“php”)。
此外,如果我没记错的话,根据http规范,“Location”头只接受完整的URL,而不是相对位置。也要记住这一点。
ryevplcw6#
不要包含header.php。当你要重定向时,你不应该输出HTML。
创建一个新文件,例如。“pre.php”。把这个放进去:
然后在header.php中,包含它,而不是包含其他两个文件。在form.php中,包含pre.php而不是header.php。
vmjh9lq97#
您的include会产生输出,因此无法在稍后发送http标头。两种选择:
1.将输出移到include之后的某个位置。
1.使用output buffering,即在脚本的最开始,放置ob_start(),在最后,放置ob_flush()。这使PHP能够首先等待收集所有输出,确定以什么顺序呈现它,然后输出它。
我建议你学习第二种选择,因为它使你更加灵活。
jucafojl8#
另请参阅您的php文件的文本编码。我的是
UTF-8
和BOM
,它阻止了脚本的工作。但现在的作品后,删除BOM
.jljoyd4f9#
尝试使用JavaScript重定向: