重定向而不重新加载整个页面

时间:2015-06-03 18:03:05

标签: php

我有一个框架,我认为我遵循MVC模式之类的东西:一个框架(模型)一个控制输入(控制器)和视图页面(包含在main中的页面)的索引页面。 php /主要的HTML)

我阅读了很多关于结构和逻辑的知识,写了一篇很好的应用程序。我读了许多评论,例如"如果您要做的就是尝试将用户重定向到另一个页面,为什么要输出任何内容?"。答案是,最常见的情况是:用户成功登录后重定向。我需要打印一些东西吗?当然,整个主页面都有一个登录表单/帖子。我应该如何进行重定向?

所以我对应用程序的逻辑和结构有点困惑。如何存储所有输出并执行标题重定向而不打印任何内容?

我正在考虑使用javascript进行重定向,但我也读过评论说; "如果您编写好的代码(遵循良好的逻辑/结构),您将不再需要使用像javascript重定向这样的黑客攻击"。怎么可能呢?

因为不应该启用php output_buffering。

我启用了output_buffering,我可以使用header(输出后)没有任何问题。如果我使用javascript重定向整个页面重新加载,但使用标题只是加载内容(main.php中包含的视图内容)。

那么如果没有output_buffering,你怎么做呢?

3 个答案:

答案 0 :(得分:2)

如果您想重定向到成功页面并传递消息 - 比如说,在成功登录后 - 一个简单的解决方案是使用“flash”会话,您可以在SESSION中存储消息,然后,一旦它被使用,你就丢弃它。你不需要在输出缓冲区中为此做任何事情。

这是一个非常基本的例子,但应该给你一个要点。

<强>的login.php

if($login_successful) {

    // put your message in the session
    $_SESSION['message'] = 'Login Successful';

    // redirect to the success page
    header('location: success.php');
}

<强> success.php

<?php
session_start();

// check if $_SESSION['message'] exists
if(isset($_SESSION['message'])) {

    // print the message
    echo $_SESSION['message'];

    // clear the session
    $_SESSION['message'] = null;
}

答案 1 :(得分:2)

看起来你在这里混淆了一些东西。你在说什么实际上是两个不同的要求。用户想要查看主页面,或者他想要在主页面上使用该表单登录。在你的index.php中你会有这样的东西(伪代码):

if (isLoginRequest) {
   // user wants to log in
   if( validateLogin($loginFormData) ) {
       redirect('successful');
   } else {
       displayLoginError();
   }
} else {
   // user wants to view main page
   echo main.html
}

更新以回答评论中的问题:更好的选择是将您的表单验证内容留在login.php中,并在登录表单<form action="login.php" ...中引用它。然后在你的login.php中你会有这样的东西:

if (loginSuccessful) {
    redirect('success.php');
    // no need to call die() or whatever
} else {
    setFlashMessage('Login failed'); //  set a flash message like timgavin described
    redirect('index.php')
    // also no die() or whatever
}

index.php然后负责显示您的主页面,如果设置,则从失败的登录尝试中呈现Flash消息。

答案 2 :(得分:0)

简单解决方案:将登录后脚本从login.php移动到另一个文件(login_post.php)。 dom输出后使用header()的其他脚本也是如此。 (无需更改表单操作=&#34;&#34;)

在index.php中:

$url = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
//some more security checks like esc_url() (non-php function)
if ($url == '/login') {
    include('header_pages/login_post.php');
}
// all these includes before including main.php
// where views pages are included and the DOM output starts

由于header()在post脚本中,所以没有更多的头文件已经发送错误(当然还有output_buffering off。)

当前包含在main.php

中的注销页面相同

感谢其他答案,他们帮助我找到了解决方案。