Tonic RESTful应用程序不重定向

时间:2012-01-27 20:36:57

标签: php rest

我目前正在使用Tonic PHP框架来构建RESTful应用程序(http://peej.github.com/tonic/),并且遇到了一个问题,我无法弄清楚如何在有人注销后重定向用户。奇怪的是登录工作正常。

我的基本代码工作列表如下:当用户登录时,他们会填写一个简单的表单,按下提交按钮,对表单所在的同一页面发送请求。 (website.com/login)帖子处理代码如下所示:

public function post( $request )
{
    if( isset( $_POST[ 'username' ] ) && $_POST[ 'username' ] === 'username' &&
            isset( $_POST[ 'password' ] ) && $_POST[ 'password' ] === 'password' )
        {
            $_SESSION[ 'loggedin' ] = true;
            $response = new Response( $request );
            $response->addHeader( 'Location', '/' );
            return $response;
        }
        else
        {
            $response = new Response( $request );
            $response->addHeader( 'Location', '/login/fail' );
            return $response;
        }
}

(当前代码只是暂时的,所以我可以测试功能)这将正确设置会话变量并重定向回我的索引页面,我的PHP代码输出所有正确的菜单和登录的东西。< / p>

我遇到的问题是,直接在我的网页菜单栏内的按钮用于注销。我尝试了两种方法,既没有工作:一个简单的锚标签,其中一个href到页面webspace.com/logout,并在菜单中放置一个只有一个重新设置的提交按钮的表单,看起来像一个普通的链接,使用post作为方法到同一页面。他们都有这个代码:

public function post( $request )
{
    $response = new Response( $request );
    $response->code = Response::MOVEDPERMANENTLY;
    $response->addHeader( 'Location', '/' );
    $response->body = "<b>Succesfully logged out!</b>";
    $_SESSION[ 'loggedin' ] = false;
    return $response;
}

(或者至少是对它的变化,尝试各种各样的事情)当从菜单栏中使用此代码时,无论是通过锚标记还是表单提交按钮,它都将转到/ logout页面并保持在那里,输出任何正文如果存在。检查用户是否“未登录”的PHP代码甚至不会触发,使菜单栏处于看起来像您当前登录的状态,即使您转到另一个页面它更改为已注销的那一刻代码,意味着您已经成功注销。我尝试了各种各样的东西,直接通过浏览器栏就可以正常工作,而不设置会话变量也会使它工作正常。 (就我所见),我不知道发生了什么。感谢您提前提供任何帮助。

1 个答案:

答案 0 :(得分:0)

没关系,我意识到了这个问题(这只是我的愚蠢):我在发布一个Location标题之前输出到页面,导致它被浏览器忽略。在我的主页上稍微改变操作顺序解决了这个问题。

让这成为对所有人的警告:确保在回显任何代码到浏览器之前发出标题,无论如何。在我的例子中,这要求我在HTML代码之前为当前URI执行所有处理代码,然后将请求的输出发送到正确位置的浏览器。