【问题标题】:Unique Inconsistent CI Blank Page Issue唯一不一致的 CI 空白页问题
【发布时间】:2025-12-26 04:25:11
【问题描述】:

参考我之前提出的CodeIgniter Blank Page 问题。

一些新信息已经曝光,可能有助于解决这个问题。

我新建的服务器(CI 2.1.3 - 最新版本)运行正常且未提供 WSOD,位于我的开发服务器的子域中。 WSOD 问题仍然发生在不在子域中的“实时”站点上。

显然“实时”站点位于 public_html 中,而开发版本位于“codeigniter”子域中。两台服务器上的其他一切都是相同的。相同的 PHP 5.3 设置。相同的 .htaccess 文件。相同的 CI 2.1.3 设置,显然配置更改为指向“开发”中的子域和“实时”中的域。

问题是一样的。在 ENTER PRESS 或外部链接激活(例如来自电子邮件)上,我在“实时”中获得 WSOD,但这在“开发”中正常工作。在“实时”中没有单击按钮就激活的每个控制器都会给我 WSOD,而所有页面在“开发”中都可以正常工作。

作为检查,我构建了一个全新的 CI 根安装(没有子域),问题准确地反映了“实时”中发生的情况。

表现出 WSOD 行为的进程没有附加视图,只是简单地打印成功消息。

代码如下:

.htaccess - 在“development”的子域文件夹和“live”的public_html:

Options -Indexes
Options +FollowSymLinks

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

RewriteCond %{REQUEST_URI} ^application.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L] 

ErrorDocument 404 /index.php

在登录后粘贴到浏览器时以“实时”状态提供 WSOD 的控制器之一是inviteusers.php 只需获取公司 ID 和用户 ID 并向用户发送包含登录详细信息的链接为新帐户。 “消息”正文中的一些无关代码已被删除以缩短它:

<?php if ( ! defined('BASEPATH')) exit('No Direct Script Access Allowed');
/**
 * Invite Users Controller
 *
 * ----------------------------------------------------------------------------
 */

class InviteUsers extends MY_Controller
{

    function __construct()
    {
        parent::__construct();
        $this->load->model('UserDetails_model');
        $this->load->helper('date');
    }

    public function index()
    {
        if (!$this->session->userdata('clientid') && !$this->session->userdata('userid')) {
            redirect('login');
        }

        // Add Client ID for All Uninvited Users for a Client
        $lookupid['clientid']   = "CID";

        // Add User ID to Add ONE Uninvited user for a Client
        // Change UserDetails_model to take UID if this option is used
        $lookupid['userid']     = "UID";

        $invites = $this->UserDetails_model->getInvites($lookupid);

        foreach ($invites as $invite) {

            if ($invite['new'] == "Y") {

                $message   = "Hi ".$invite['username']." ".$invite['usersurname'].", \n \n";    
                $this->load->helper('email');

                $this->email->set_newline("\r\n");
                $this->email->from('email@address.com', 'System Messenger');
                $this->email->to($invite['useremail']);
                $this->email->bcc('admin@address.com');
                $this->email->subject('Temporary Login Details');
                $this->email->message($message);

                $sent = $this->email->send();

                if ($sent) {
                    echo "SUCCESS!!!   ";
                    echo "NAME:     ".$invite['username']." ".$invite['usersurname']."   ";
                    echo "E-MAIL:   ".$invite['useremail']."   ";
                    echo "PASSWORD: ".$invite['temppass']."   ";
                    echo "NEW:      ".$invite['new']."";
                }

            } else {

                $message   = "Hi ".$invite['username']." ".$invite['usersurname'].", \n \n";

                $this->load->helper('email');

                $this->email->set_newline("\r\n");
                $this->email->from('email@address.com', 'System Messenger');
                $this->email->to($invite['useremail']);
                $this->email->bcc('admin@address.com');
                $this->email->subject('Temporary Login Details');
                $this->email->message($message);

                $sent = $this->email->send();

                if ($sent) {
                    echo "SUCCESS!!!   ";
                    echo "NAME:     ".$invite['username']." ".$invite['usersurname']."   ";
                    echo "E-MAIL:   ".$invite['useremail']."   ";
                    echo "PASSWORD: ".$invite['temppass']."   ";
                    echo "NEW:      ".$invite['new']."   ";
                }

            }

        }

    }

}
/*
 * End of file inviteusers.php
 * Location: ./application/controllers/inviteusers.php
 */

正如我之前所说的 - 这个过程正在开发中,但会在 LIVE 中提供 WSOD。

MY_Controller 只是执行会话查找并检查一些变量。它简单而可靠,并且一直在没有模组的情况下工作。

我认为可能有一个重要线索,因为它在最近设置的子域中正常工作,具有相同的 .htaccess 文件和配置更改以反映 URL。所有其他环境变量完全相同。相同的服务器,相同的托管公司,运行相同模块的相同 Apache 版本,具有相同模块、超时、内存等设置的相同 PHP 版本。

提供 WSOD 的控制器让我可以快速轻松地访问某些管理功能,因此它们必须工作......而且它们确实......在同一服务器上的“开发”子域中运行在 public_html 中。

【问题讨论】:

  • 在你的 index.php 中开启错误报告 ini_set('display_errors', 1);
  • 为什么系统和应用程序目录有mod_rewrite规则? ErrorDocument 404 指令之前的最后一个规则块通常足以激活前端控制器。
  • 谢谢!一切都开启错误报告!!!
  • @jtp: 不知道...在我复制的示例 .htaccess 中。尽管经过一些阅读,我认为我可能会排除前两个规则,但它似乎工作得很好!正如我所说 - n00b,自学 PHP 和 CI - 我知道足够危险......哈哈。

标签: codeigniter


【解决方案1】:

如果满足某个条件场景,你不会输出任何东西!

只有当$sent 变量等于true(也就是您的电子邮件已成功发送)时,您才会回显信息。如果它没有,你什么都没有显示!由于没有实际的 PHP 错误,因此启用它们不会解决任何问题(尽管 99% 的情况下,这是空白页背后的问题)。

使用电子邮件的调试器在此处发送else 语句,您应该会得到一些关于正在发生的事情的指示。

if ($sent) {
    echo "SUCCESS!!!   ";
    echo "NAME:     ".$invite['username']." ".$invite['usersurname']."   ";
    echo "E-MAIL:   ".$invite['useremail']."   ";
    echo "PASSWORD: ".$invite['temppass']."   ";
    echo "NEW:      ".$invite['new']."";
}
else
{
    echo $this->email->print_debugger();
}

此外,不管怎样,您的 .htaccess 不需要系统和应用程序文件夹的规则。您也不需要在 RewriteRule URL 的前面加上斜线(RewriteBase 会为您处理)。

Options -Indexes
Options +FollowSymLinks

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L] 

ErrorDocument 404 index.php

【讨论】:

  • 感谢您的提醒...这弹出了这样一个事实,即我的电子邮件设置用于开发,但尝试使用生产电子邮件地址...正如荷马所说:“DOH!!!”我将此标记为答案,因为它在检查空格、逗号、分号、引号等代码的 DAYS 之后直接导致答案,但无处可去。 Cryode - 如果你在南非,给我发电子邮件,我会给你买一个冷冰冰的!!!
  • 我还将检查我的代码并添加一些健全性检查,以阻止这样的事情让我完全发疯......作为一名前 COBOL 黑客 - 我喜欢 MVC 的可重用性OO 代码范例虽然我有时倾向于恢复输入并完全程序化而不是创建对象......我们生活和学习!再一次 - 非常感谢你!!!
  • 去看看 - 所有失败的页面都是因为电子邮件详细信息不正确!
  • 很高兴您能够解决您的问题。我很想有一天去南非!