PHP标题位置重定向不工作[重复]

qgelzfjb  于 2023-10-15  发布在  PHP
关注(0)|答案(9)|浏览(101)

此问题已在此处有答案

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">
vtwuwzda

vtwuwzda1#

仔细看看你的包括-也许你有一个空白行后,关闭?>?
这将导致一些文本空白作为输出发送,阻止您进行后续的头调用。
注意离开关闭是法律的吗?>关闭包含文件,这是避免这个问题的一个有用的习惯用法。

  • (编辑:查看您的标题,如果您想输出标题,则需要避免进行任何HTML输出,或使用输出缓冲来捕获它)。

最后,正如PHP manual page for header所指出的,你真的应该使用完整的URL来重定向:
注意:HTTP/1.1需要一个绝对URI作为 Location: 的参数,包括方案、主机名和绝对路径,但有些客户端接受相对URI。你通常可以使用$SERVERHTTP_HOST '],$_SERVER_ PHP_SELF']和dirname()从一个相对的URI创建一个绝对的URI:

uubf1zoe

uubf1zoe2#

或者,不考虑文件中的某个地方的换行符或空格,您可以缓冲输出。基本上,在文件的开头调用ob_start(),在文件的结尾调用ob_end_flush()。您可以在php.net ob-start function description找到更多信息。

**编辑:**如果使用缓冲,可以在header()函数之前和之后输出HTML-缓冲将忽略输出,只返回重定向头。

hpxqektj

hpxqektj3#

试试这个:

**ob_start();**

include 'header.php';

// ... some code

header('Location:index.php');

**ob_end_flush();**

exit;
qlfbtfca

qlfbtfca4#

如果我理解正确的话,已经从header.php发送了一些东西(可能是一些HTML),所以头已经被设置了。您可能需要重新检查您的header.php文件中的任何可能输出HTML或空格的部分,然后才能首次

**编辑:**我现在确定它是由header.php引起的,因为你有那些HTML输出。您可以通过删除“include('header.php');“行,并将下面的代码复制到文件中。

include('class.user.php');
include('class.Connection.php');

        $date = date('Y-m-j');
hsvhsicv

hsvhsicv5#

你可能在php文件中的某个地方有一些“纯文本”被解释为脚本输出。它甚至可以是php脚本标记说明符之前或之后的一个换行符(小于+问号+“php”)。
此外,如果我没记错的话,根据http规范,“Location”头只接受完整的URL,而不是相对位置。也要记住这一点。

ryevplcw

ryevplcw6#

不要包含header.php。当你要重定向时,你不应该输出HTML。
创建一个新文件,例如。“pre.php”。把这个放进去:

<?php
include('class.user.php');
include('class.Connection.php');
?>

然后在header.php中,包含它,而不是包含其他两个文件。在form.php中,包含pre.php而不是header.php。

vmjh9lq9

vmjh9lq97#

您的include会产生输出,因此无法在稍后发送http标头。两种选择:
1.将输出移到include之后的某个位置。
1.使用output buffering,即在脚本的最开始,放置ob_start(),在最后,放置ob_flush()。这使PHP能够首先等待收集所有输出,确定以什么顺序呈现它,然后输出它。
我建议你学习第二种选择,因为它使你更加灵活。

jucafojl

jucafojl8#

另请参阅您的php文件的文本编码。我的是UTF-8BOM,它阻止了脚本的工作。但现在的作品后,删除BOM.

jljoyd4f

jljoyd4f9#

尝试使用JavaScript重定向:

<script type="text/javascript">
  window.location.href='index.php';
</script>

相关问题