PHP中用于重定向的“header”的替代方案

10

我正在开发一个项目,需要在别人的Web服务器上运行我的程序。问题出在一个简单的登录页面上。如果我通过WAMP在本地主机上运行它,程序可以正常工作。但是问题是重定向部分没有正确工作。它验证了用户并开始了会话,但是当到达重定向部分时什么都不会发生。

我认为语法方面可能没有问题,因为在本地主机上可以正常工作。或者,我在想服务器可能没有这个功能(不确定它是否可能挑选并选择要支持哪些模块,尽管我相信这是可行的)。

我不知道这是否重要,但他们正在使用"cpanel",这是我可以访问文件的地方,而且它们都在同一个目录中。如果有人能告诉我我做错了什么,或者提供一种通过“header”以外的重定向替代方式,那将不胜感激。我已经四处找过,但似乎“header”是标准解决方法。

以下是我的代码:

if( (!empty($_POST['username'])) && (!empty($_POST['password'])) )
{
// username and password sent from Form 
$myusername = $_POST['username']; 
$mypassword = $_POST['password']; 


$sql="SELECT UserName FROM User WHERE UserName='$myusername' and        Password='$mypassword'";

$result=mysql_query($sql);

$row=mysql_fetch_array($result);
//$active=$row['active'];
$count=mysql_num_rows($result);

// If result matched $myusername and $mypassword, table row must be 1 row
if($count==1)
{
    echo "we made if to the if";
    session_start();
    session_register("myusername");
    $_SESSION['login_user']=$myusername;
    echo "right b4 the re-direct";
    header("location: UI.php"); 
            exit;
}
else
    echo "Your user name/password was not correct pleast TRY AGAIN!!!";

} 
更新:回应有关echo语句的说法,可能问题出在我正在同一文件中处理表单并使用echo $_SERVER ['PHP_SELF'] 。

1
你启用了错误报告吗?你确定条件已经满足并且头部已发送了吗? - Pekka
在头部调用之前,您不能输出任何页面内容。您的调试语句正在阻止重定向工作。 - JJJ
是的,我尝试过删除它们,但仍然无法正确重定向。 - cpowel2
请参考PHP已发送的标头中的<meta>替代方案。 - mario
8个回答

44

我使用这个函数进行重定向...

它可以在所有情况下工作,即使头信息已经发送,甚至JavaScript被禁用也不例外。

function redirect($url)
{
    if (!headers_sent())
    {    
        header('Location: '.$url);
        exit;
        }
    else
        {  
        echo '<script type="text/javascript">';
        echo 'window.location.href="'.$url.'";';
        echo '</script>';
        echo '<noscript>';
        echo '<meta http-equiv="refresh" content="0;url='.$url.'" />';
        echo '</noscript>'; exit;
    }
}

为什么不直接使用meta refresh标签呢?这样可以减少很多字节。 - Sainan
浏览器上的后退按钮不起作用!重定向后,浏览器跳过了之前的页面,回到了相当于两个页面... - Damian Green

4
通过使用以下代码,我们可以重定向页面。
$page = $_SERVER['REQUEST_URI'];
echo '<script type="text/javascript">';
echo 'window.location.href="'.$page.'";';
echo '</script>';

2
echo "<script>window.location.href='yourPage.php'</script>";

2

来自文档

请记住,在发送任何实际输出之前调用header(),无论是通过常规HTML标记、文件中的空行还是来自PHP。

您的echo导致重定向失败,任何在头部之前发送的输出都会导致失败。


1

如果有任何内容通过,请勿使用标题重定向。删除所有的echo,它应该可以工作。如果您确实希望在重定向之前向用户显示消息,则可能需要使用JavaScript通过location.href来完成。


谢谢。 <script> window.location.href = "index.php"; </script> 完成了工作。 - Arijit Bag

1

在输出一些文本后,您无法设置标头,因此您可以将 header 调用移动到 echo 语句之前(在您的情况下很好),或者您可以使用 输出缓冲


0
Use This Code 

语法:

  echo '<script type="text/javascript"> window.location="<Your_URL>";</script>';


write this line insted of header("location: UI.php");


   echo '<script type="text/javascript"> window.location="UI.php";</script>';

3
一个好的回答应包括你编写的代码的一些解释...您可以通过添加一些澄清来改进您的答案吗? - DaFois

0

在发送 PHP 标头之前,您可能已经向浏览器发送了内容。这可能只是一个关闭 PHP 标记(?>)后的 \n。

在更大的项目或长类行扩展中,查找生成不必要输出的位置可能很困难。为了找到问题,您可以执行以下操作:

 error_reporting(E_ALL); 
 ini_set("display_errors", 1);
 header("Location: https://mydomain.com/myLoginAdress/");
 die();

启用严格的错误报告将抛出输出的行和文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接