【问题标题】:Redirect website from within frame PHP从 PHP 框架内重定向网站
【发布时间】:2025-12-03 01:25:01
【问题描述】:

我有一个网页,我们称之为 main.php,它显示了足球场的图像和一些分布在球场上的球员。但是,该页面使用 list.php 作为加载玩家列表的右侧框架。

会发生什么,当用户点击场上的一名球员 (main.php) 时,假设在守门员 (GK) 的图像上,来自世界各地的 GK 列表团队将加载正确的列表框架(list.php)。这是通过使用 ajax。

到目前为止,我们都很好。

目前的情况是,当会话超时,用户点击该场上的一名球员时,右侧的列表不会加载,而是球员列表从列表中消失,并出现一个消息说“请登录”显示在右侧框架(list.php)

目标是,当会话超时时,我希望整个网站重定向到主页 index.php

问题是,我已经将重定向代码放在负责显示“请登录”消息的代码之前。但是发生的事情是,重定向发生在框架内,所以我最终让 main.php 显示该字段,而 list.php 显示主页!

这是我添加的代码。

$user_id = NSession::get('user_id');
 if (!isset($user_id))
{
        NSession::removeall();         
        General::Redirect('index.php');
}

他们正在使用 Smarty。顺便说一句,我在 main.php 的顶部添加了相同的代码,现在如果用户尝试在不登录的情况下访问 main.php,它会将他重定向到主页,因此代码可以正常工作!

n.b.这个项目不是我的,它属于我工作的公司。 而且我不知道哪个代码正在检查会话,我所知道的是,如果用户在会话超时后从该字段中单击一个玩家,则“请登录”消息将显示在框架中。

【问题讨论】:

    标签: php javascript frame redirect


    【解决方案1】:

    我猜重定向本质上与使用 header() 函数相同。无法使用 php 重定向指定目标,因为它是服务器端 - 指定目标是客户端。

    您需要在屏幕上打印这样的内容:

    <script type="text/javascript">window.open('index.php','_parent');</script>
    

    这会将用户重定向到索引。

    【讨论】:

      【解决方案2】:

      为了这样的目的使用框架是......嗯......所以 80 年代......

      无论如何,框架可能是在这种情况下命名的。这意味着您可以解决它们,但也意味着您必须解决它们。只需在“当前”框架内加载一个 url 就可以做到这一点,这就是为什么你的方法行不通的原因。

      如果您真的必须采用基于框架的方法,那么您将不得不使用 javascript 来处理所有已知的框架并重定向它们。

      【讨论】:

        【解决方案3】:

        也许您可以像这样在框架内使用一些 javascript:

        <script type="text/javascript">
        
            window.top.location = 'YourPage.html';
        
        </script>
        

        希望对你有帮助

        【讨论】:

        • 已经用过了。结果相同。它从框架内加载。
        【解决方案4】:

        问题是我在 main.php 上时会话过期。因此,任何后续的 Ajax 请求都将失败,因为所有请求都需要会话处于活动状态。

        问题是从 IFrame 发送的 Ajax 请求(IFrame 在 main.php 中并通过 Ajax 调用指向 list.php)由于会话到期而失败。

        所以我通过添加另外两个会话检查来解决这个问题,一个在 main.php 上,使用 PHP 的 list.php (检查会话,如果它在那里,重定向)。在主容器main.php中,我通过JS检查会话,间隔Ajax请求检查会话,如果会话已经结束,则使用JS重定向。

        PHP:

         $user_id = NSession::get('user_id');
        if (isset($_POST["checklogin"]))//check loging
        {
            die(isset($user_id) ? "true" : "false");
        }
        if (!isset($user_id) || $user_id == "")
        {
           NSession::removeall();
           General::Redirect('login.php');
        }
        

        JavaScript:

        jQuery(document).ready(function($) {
        
            $(window).focus(function() {
                checkSession();
            });
        });
        
        
        function checkSession()
        {
            $.ajax({
                type: "POST",
                data: {"checklogin": "cl"},
                url: "list_players.php",
                success: function(result) {
                    if (result === "false")
                    {
                        if (FIELD.showMessage === false)
                        {
                            FIELD.showMessage = true;
                            alert("Your session has been closed\nYou will be redirected to login page now. ");
                            window.location.href = ("login.php");//incase user clicks OK                   
                        }
                    }
                }
            });
        }
        

        【讨论】: