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


PHP redirecting pulls up blank page (only when deployed on server)

>我正在将我在计算机上开发的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();
     ?>

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

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

请注意,我只能包含函数.php文件,如果我包含任何其他重定向不再有效,只是转到空白页...我可以将包含文件中的代码复制到此文件中,就像我上面使用常量.php文件所做的那样

,如下所示:
     <?php
            // Database constants
        define("DB_SERVER", "mysite.ipagemysql.com");
        define("DB_USER", "root");
        define("DB_PASS", "notreal");
        define("DB_NAME", "myCMS");
     ?>

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

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

任何帮助或见解将不胜感激,感谢您抽出宝贵时间阅读本文。

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

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

你正在使用琳达练习文件吗?在 PHP 中,标头必须在任何其他内容之前声明,包括空格。您的其他包含文件中有一些内容违反了 PHP 标头规则。数据库常量应以常量.php表示。

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

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

如果取消注释任何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");

还要检查是否未在要包含的任何文件(例如常量.php(中定义DB_SERVER、DB_USER、DB_PASS DB_NAME,因为定义只能定义一次,并在发送标头之前检查是否未输出任何内容。

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

ini_set('display_errors', 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 的新手,部署在我不熟悉的服务器上。希望如果您有类似的问题,您会发现其中一些有帮助。