PHP重定向会拉出空白页面(仅在部署在服务器上时)

时间:2012-01-11 01:51:24

标签: php redirect

我正在将我在计算机上开发的CMS部署到我的第一个域服务器上,并且我遇到了使用调用函数重定向到PHP页面(在javascript中工作)的问题:

    header("Location: {$location}");

通过WAMP在家用机器上一切正常。但是在我部署到服务器上之后,它将重定向到空白页面。我已经在一个单独的文件中测试了这个问题,发现只要包含redirect_to函数的文件只包含它就可以了,所以看起来像这样:

    <?php //require_once("includes/session.php");?>
    <?php require_once("includes/functions.php");?>
    <?php //require_once("includes/constants.php"); ?>
    <?php //require_once("includes/connection.php"); ?>
    <?php 
        define("DB_SERVER", "mysite.ipagemysql.com");
        define("DB_USER", "root");
        define("DB_PASS", "notreal");
        define("DB_NAME", "myCMS");

        redirect_to("login.php");
        phpinfo();
     ?>

这是我在functions.php中定义的重定向函数:

     // redirects the user to the page/path specified by $location
     function redirect_to($location){
         if($location != NULL){
             header("Location: {$location}");
             exit();
          }
     }

请注意,我只能包含functions.php文件,如果我包含任何其他重定向不再有效,只需转到空白页面...我可以将包含文件中的代码复制到此文件中我在上面使用了constants.php文件,如下所示:

     <?php

            // Database constants
        define("DB_SERVER", "mysite.ipagemysql.com");
        define("DB_USER", "root");
        define("DB_PASS", "notreal");
        define("DB_NAME", "myCMS");
     ?>

我可以定期从域服务器加载所有CMS页面,访问数据库并保存到它。由于我可以保存到数据库,因此我假设包含我正在测试的任何文件都没有问题,因为它们都是访问数据库所需要的。问题纯粹是重定向。一切正常如何设置在我的comp作为localhost运行。

我一直在查找这些问题并整天尝试解决方案。我已经将其缩小到无法包含其他文件的问题,但我不明白为什么,它只发生在域服务器上......

非常感谢任何帮助或见解,感谢您花时间阅读本文。

4 个答案:

答案 0 :(得分:1)

如果暂时将错误报告转换为E_ALL,可能会有所帮助。看起来您可能有一些输出从另一个包含的文件发送到浏览器。通常输出很容易错过,比如关闭后额外的回车?&gt;标签。最好省略所包含文件上的结束标记,因为它们不是必需的,并且可以防止意外输出。

如果您收到看不见的输出,这意味着在发送位置标头时已经发送了标头,因此它不起作用。

答案 1 :(得分:0)

你在使用Lynda运动档案吗?必须在PHP之前的其他任何内容中声明标头,包括空格。您的其他一个包含文件中的某些内容违反了标头的PHP规则。您的数据库常量应在constants.php中说明。

如果您使用的是Lynda ex。文件,我建议进入下一个级别(我认为它被称为PHP / MySQL Beyond the Basics),那里有很多有用的代码片段。

至于解决此问题,如果您希望立即将用户重定向到登录页面,请只包含您的函数文件和redirect_to。将其他包含移动到名为“initialize.php”的文件中,并在登录页面上加载该文件。

答案 2 :(得分:0)

如果取消注释任何require_onces导致页面为空,则所需文件中存在致命错误,或者致命错误是找不到所需文件。听起来你甚至都没有进入redirect_to函数。在文件的顶部添加这些行,这些行将提供有关错误的更多信息:

error_reporting(E_ALL);
ini_set('display_errors', 1);

所以你的代码看起来像是:

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

require_once("includes/session.php");
require_once("includes/functions.php");
require_once("includes/constants.php");
require_once("includes/connection.php");

define("DB_SERVER", "mysite.ipagemysql.com");
define("DB_USER", "root");
define("DB_PASS", "notreal");
define("DB_NAME", "myCMS");

redirect_to("login.php");

同时检查您是否在包含的任何文件(例如constants.php)中定义了DB_SERVER,DB_USER,DB_PASS,DB_NAME,因为定义只能定义一次,并且在发送之前检查是否没有输出任何内容标题。

如果这是一个实时网站,请记住在解决问题后将display_errors设置为0。

ini_set('display_errors', 0);

答案 3 :(得分:0)

非常感谢您的帮助和见解,因为您的意见我能够找出问题所在。首先,这是一个愚蠢的错误davidethell指出确保没有任何PHP包含文件有任何空格或返回

    before the <?php or after the closing ?>

然后我遇到了一个问题,我在每个页面上都遇到了这个错误:

Warning: Cannot modify header information - headers already sent by...

但它抱怨包含文件中的行号在实际文件的最后一行之后是3行。我四处搜索,发现如果在每个显示的页面中我都放了:

    <? ob_start(); ?> 

在文件的最开头(包括之前)然后在最后我把:

    <? ob_flush(); ?> 

这消失了错误消息,一切仍然正常。我没有花时间查看该功能的功能,我现在要查找它。我很确定它与缓冲有关。这可以解释为什么它似乎会减慢页面上的交互,主要是页面重定向。但这可能只是服务器的延迟。

我是php新手并在我不熟悉的服务器上部署。希望如果你有类似的问题,你会发现其中一些有用。