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