标头重定向不在服务器上工作但在localhost上工作

时间:2013-03-14 00:00:28

标签: php

我使用bluehost作为我的虚拟主机,我遇到了一些问题。下面的代码是我的困惑点。

<?php
include '../init.php';
error_reporting(0);
?>
<div class='container'>
<html>
<head>
<link rel="stylesheet" type="text/css" href="/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="/bootstrap/css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="/bootstrap/css/responsive.css">    
<link rel="stylesheet" type="text/css" href="/bootstrap/css/responsive.min.css">
<script language="JavaScript" type="text/javascript" src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<link rel="stylesheet" type="text/css" href="SignIn.css">
<title>SoundBooth - Sign in</title>
<link rel="icon" href="../Images/Logo.png" type="image/x-icon"/>
</head>
<body  background="../Images/BGMain.png">
<div class='signinLabel'>Sign in</div>
<div class='bg'></div>
<div class='user'>Username</div>
<div class='pass'>Password</div>
<form action="index.php" method='POST'>
  <input name='Username' autocomplete="off"class='usr' type="text" style='height:34px;'/>
  <input name='Password' autocomplete="off"class='pas'type="password" style='height:34px;'/>

  <input type='submit' class='submit' value='Log in' ></input>
</form>
<a class='forgotPass' href="#">(Forgot password)</a>
<div class='no-account-label'>Don't have an account? |</div>
<a class='no-account-button' href="/signup">Sign up</a>
<?php
 if (empty($_POST) === false){
    $username = $_POST['Username'];
    $password = $_POST['Password'];

    if (empty($username) || empty($password)){ ?>
            <div style="float:left;margin:-415px 200px;width:500px;text-indent:100px;"class="alert alert-error">You need to enter a username and password!</div>
            <?php
        }elseif (user_exists($username) === false){?>
            <div style="float:left;margin:-415px 170px;width:500px;text-indent:100px;"class="alert alert-error">We can't find that username! Have you <a style='color: rgb(185, 74, 72);' href='../HTML/signup.html'>registered?</a></div>
            <?php
        }elseif (user_active($username) === false){ ?>
            <div style="float:left;margin:-415px 200px;width:500px;text-indent:100px;"class="alert alert-error">You haven't activated your account!</div> <!--Remove this-->
            <?php
        }else{

            $login = login($username, $password);
            if ($login === false){ ?>
            <div style="float:left;margin:-415px 200px;width:500px;text-indent:100px;"class="alert alert-error">The username or password you have entered is incorrect!</div>
            <?php
            }else{
                $errors[] = 'Logging In...';
                $_SESSION['user_id'] = $login;
                if (isset($_SESSION['user_id'])){
                mysql_query("UPDATE `users` SET `online_offline`='1' WHERE `user_id`='$_SESSION[user_id]'");
                }
                header("Location: http://sound-booth.com/");
                exit();
            } 
        }
    }
    echo output_errors($errors)
?>
</div>
</body>
</html>

是脚本的链接。它适用于localhost,但不适用于我的实际服务器。即使header()重定向也不起作用。

有人可以解释一下吗?

解决方案:

ob_start();

12 个答案:

答案 0 :(得分:9)

最好的选择就是这样使用。

// Use this line instead of header
echo "<script>location='your_url.com'</script>";

答案 1 :(得分:6)

在发送任何输出之前必须设置标头。在进行header()调用之前,您正在向用户发送大量HTML。也许它在一个环境中工作但在另一个环境中工作,因为output_buffering在您的localhost php.ini上设置,但在服务器上没有。

您应该重新编写代码以确保在任何内容之前发送header(),但如果您想让它正常工作,请将ob_start()附加到代码的开头,它将强制执行缓冲。

答案 2 :(得分:2)

必须在HTTP响应之前发送HTTP标头。即,您必须在回显任何其他内容或发送任何HTML之前致电header

有可能,它在本地服务器上运行的原因是因为您在那里配置了output buffering。您可以在页面顶部插入对ob_start();的调用,以在脚本中启用输出缓冲。然后,由于HTML将被缓冲,直到脚本完成,重定向头可以首先到达浏览器,因为它必须。或者,您可以重新编写脚本以将header调用置于顶部。

答案 3 :(得分:2)

使用 ob_start();之后的<?php,并在文档末尾使用ob_end_flush();

答案 4 :(得分:1)

header("Location: http://sound-booth.com/");

它在文本输出之后。

使用OB_start()或更改代码。

答案 5 :(得分:0)

您可能已关闭错误报告,这就是您不会收到错误消息的原因。

如果你之前有一个空格,那么

header()不起作用。您需要将它放在所有字符串输出之上才能使其正常工作。

答案 6 :(得分:0)

OP,

您的<div class='container'>标记<{1}}前面有<html> 标记(然后在</body>之前关闭。

在打开<div class='container'>代码后尝试移动<body>

希望有所帮助。

答案 7 :(得分:0)

我认为您正在收到PHP警告:无法修改标头信息 - 标头已经存在 发送 他们在这里解释得更好http://www.herongyang.com/PHP/Cookie-ob_start-Output-Buffer-Function.html

答案 8 :(得分:0)

我一直面临同样的问题。最后的答案对我有用。

echo“location ='https://mysiteurl.in'”;

感谢Jon Surrell。它甚至还带有会话值。

答案 9 :(得分:0)

$r=mysqli_query($con,$stmt);
if(!$r)
{
    die("Server failed" . mysqli_error($con));
}
else{
header("Location: index.html");
exit();
}?>

上述代码对我有用。

答案 10 :(得分:0)

页面的第一行使用

<php ob_start();?>

然后在头文件下面使用

ob_end_flush();

例如像这样。

   <?php
ob_start();
?>
<?php
//Get values from the post Operation
require_once 'db/conn.php';

    if (isset($_POST['submit'])) {

        //extract values from the $_POST array
        $id = $_POST['id'];
        $fname = $_POST['firstName'];
        $lname = $_POST['lastName'];
        $dob = $_POST['dob'];
        $email = $_POST['email'];
        $contact = $_POST['phone'];
        $specialty = $_POST['specialty'];

        //call crud Funtion
        $result = $crud->editAttendees($id, $fname, $lname, $dob, $email, $contact, $specialty);
        //redirect  to index.php
        if ($result) {
        header("Location: viewrecords.php");
        ob_end_flush();
        
        } else {
            echo "error";
        }
    } 

答案 11 :(得分:-1)

我认为ob_start()函数调用是解决此问题的最佳方法。可以在逻辑语句之后调用标头函数的属性。这是传递值,而只是采用它的前一个值。

引用:https://www.php.net/manual/en/function.ob-start.php