2015-06-02 45 views
1

我有一个主要的网页登录和重定向使用header()没有任何问题。标题已经发送只在子域

我也有另一个网页,需要登录,所以我做了另一个login.php页面。

两个网页具有相同的结构,其实我只是复制粘贴的主网页到另一个网页,改变VAR姓名等

如果我在主网页都在日志中还好吧,没有任何警告。但是,如果我登录的其他网页,我得到以下警告:

Warning: Cannot modify header information - headers already sent by (output started at /home/aet/platform.corporativelines.com/themes/aet/main.php:12) in /home/aet/platform.corporativelines.com/pages/login.php on line 18 

这是main.php:12

<title>AET | <?php print $title ?></title> 

这是的login.php线18

header("Location: /home"); 

主要网页在这些行中有相同的,完全相同但没有警告......有人可以告诉我为什么吗?

这两个网页都在一个子域中,但main只是暂时的,我会在完成后移动它。也许这有些事情要做...(如果你想访问,“pre”是临时子域)

该框架对于这两个网页都是相同的,自定义会话启动函数将域设置为“.domain .com“like says here

PHP代码:

index.php文件(包括网站):

ini_set('display_errors', '1'); 
//requires and initializations 
$hasExpired = $web_user::sec_session_start(); 
$client = $web_user->login_check(); // FALSE OR CLIENT 

$isLogged = false; 
$includes1 = array(
     '/pages'      => $pages . 'pages.php' 
); 

if ($client != false) { 
    $isLogged = true; 
    $includes2 = array(
     '/morepages'     => $pages . 'morepages.php' 
    ); 
} 
else { 
    $includes2 = array(
     '/otherpages'     => $pages . 'otherpages.php' 
    ); 
} 
$includes = array_merge($includes1, $includes2); 

$url = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); 
//some more security checks for url 
$title = $lang->getW($url); 

include('themes/aet/main.php'); 

main.php(包括网站):

<?php 
    defined('_AET') or die(); 
?> 
<!DOCTYPE html> 
//html structure 
<title>AET | <?php print $title ?></title> 
//body 
//main 
<?php 

    $include = '/404'; 

    if (array_key_exists($url, $includes)) { 
     $include = $url; 
    } 

    include($includes[$include]); 
?> 

login.php中(包括网站):

// login post, checks and call to function 
if ($login_array[0] == "OK") { 
    header("Location: /home"); 
} 
// login form html 

我可以说他们是山姆在这两个网页中的e页。

编辑:对不起,我还没有清楚。在这两个网站我有ini_set('display_errors','1');在主网站我没有得到任何错误加上头()重定向工作正常。在其他网站,我收到错误,如果我禁用它们,错误将不会显示,但重定向都不起作用。

+0

是否有可能关闭错误报告?所以错误存在,但没有被显示? – sharf

+0

不,对不起,我忘了补充:在索引中我有ini_set('display_errors','1');在这两个index.php –

+1

^^如果这是差异,那么它可以解释为什么你会看到错误,尽管它肯定发生在两者中。 [这是错误的原因](http://stackoverflow.com/questions/8028957/how-to-fix-headers-already-sent-error-in-php) - 你不能有任何_any输出任何kind_在一个'header()/ session_start()/ setcookie()'调用之前,但你有' <?php print $ title?>'其他的HTML,可能还有一些空白。 –

回答

0

“问题”是(首先)在输出后调用header(),(second)是启用output_buffering。

为了解决这个问题,我只是将登录帖子脚本(以及任何其他调用header()的脚本)移动到另一个文件中,并在包含main.php之前将其包含在index.php中(在HTML/Dom输出开始之前)。

if ($url == '/login') { 
    include('pages/headers/login_post.php'); 
} 

// now we can safely start the DOM output 
include('themes/main.php'); 
+1

这不是一个谜,输出缓冲区保持输出形式被发送到客户端,直到达到一定的大小,或脚本退出时(以先到者为准);因此,在达到该大小之前,仍可以发送标题。不过,这仍然是一个糟糕的做法。 –

+0

是的,有点哈克。那么我会找到另一种方式。我会发布它。 –

0

在main.php中,它看起来像是在输出php注释 - 仔细检查在您的DOCTYPE(即HTML输出的第一行)之前是否从PHP输出了任何内容(包括空格)。

如果你有一个PHP脚本,做到这一点:

<?php 
print "before headers: will cause a problem"; 
?> 
// this will also cause text to be output 
<!DOCTYPE html> 
<html> ... 

你将有一个问题。如果不是这样,你可以发布main.php的整个开始。

+0

我刚刚添加了main.php的第一行4行。这很奇怪,因为在主网站我没有得到错误...并且都是复制粘贴,必须是我做的一些改变......嗯,我没有在主网站上的if $ hasExpired检查,但是不能成为问题...因此,在main.php主文件中,我只有1个打印文件,但在另一个main.php文件中有3个打印文件...我将检查它。 –

+0

defined()返回true或false - 我认为你需要将它包装在if()语句中?如果你想使用die() - 然后输入错误信息。查看try/catch和Exceptions以获得更好的错误控制,从HTML头部分删除// php样式注释,然后重试。 –

+0

对不起,我在main.php中没有任何php/html注释(我刚刚删除了注释的代码),而且我仍然看到错误,但不在主网页中。我不知道为什么... –

相关问题