我应该通过PHP或Javascript处理重定向吗


Should I handle redirection via PHP or Javascript?

我正在重构一些旧代码,并试图更好地理解headers

我在下面关于发送标题之前没有输出的帖子中读到了一个很棒的答案!现在我明白了"为什么",但当谈到实现时,它仍然有点模糊。

当使用搜索到的值单击取消按钮时,我的当前页面将重定向回。

我将请求的页面和值存储在会话变量中,允许我这样做:

if (isset($_SESSION['searchPage'])){
 header('Location:searchForm.php?ticket='.$_SESSION['product'].'&searchbtn=Search');
 exit();
}

然而,为了在显示页面中实现这一点,我不得不使用ob_start()

为了避免这种变通方法,我发现我可以通过javascript:重定向

if (isset($_SESSION['searchPage'])){
    echo '<script>window.location="searchForm.php?product='.$_SESSION['product'].'&searchbtn=Search";</script>';    
    exit(); 
}

现在回答我的问题

  1. 哪种方法更好或可以接受
  2. 我似乎想不出一种方法来设计我的页面,在使用header()之前不发送任何输出。如果按钮点击事件导致重定向,在不使用ob_start()的情况下,如何在php中处理重定向

编辑
首先,您可能想了解更多关于使用header重定向的信息。不只是设置header('Location:...');,而是使用以下代码重定向:

header ('HTTP/1.1 301 Moved Permanently');
header('Location:searchForm.php?ticket='.$_SESSION['product'].'&searchbtn=Search');

301重定向通常对SEO更好,大多数浏览器都会缓存重定向,因此客户端历史记录堆栈将更可靠,这对可能使用历史记录的JS脚本来说是个好消息。。。

  1. 哪种方法更好

PHP。仅仅依靠JS重定向客户端不是一个好主意。客户端可能会关闭你的脚本,或者如果JS代码中出现一些错误,重定向将无法工作。一些被绑架的青少年可能会觉得篡改了你的代码,并在你的网站上发现了可能的安全问题。

 nbsp 2.如何使用ob_*,或者如何在没有ob_*的情况下使用header

只需使用ob_start()调用启动您的输入脚本(index.php)即可确保。也许可以使用ob_implicit_flush(true)来隐式刷新输出缓冲区。但更重要的是,只需在设置好标题后立即调用ob_flush()即可
或者考虑使用类似Symfony2和/或ZendFW的框架。处理重定向的代码已经为你写了很多次了,为什么不使用它呢?

如果你想避开输出缓冲,也许你可能想考虑遵循某些模式或设计原则(如MVC、IPO等),并将代码编写为(+-)始终遵循以下顺序来处理业务:

  • 获取请求
  • 处理请求中的数据,确定客户端要求的数据
  • 结构数据
  • 呈现页面
  • 发送响应

处理完请求后,您就可以重定向,而且由于您甚至还没有接近于呈现输出,更不用说发送标头了,因此可以安全地重定向和/或设置标头。。。

更新:
只是一个链接,以回应你的后续问题Gruyere有一个关于XSS攻击的特别章节,你可能想读。。。尽管我相信该文档的主要目的是如何安全地使用mashup(实际上是真正的XSS注入)。无论如何,他们在解释JS为什么以及如何被用来破坏任何网络应用程序的安全性方面做得更好。

最好在服务器端进行。无论是从SEO的角度来看,还是因为如果用户禁用了JavaScript,或者下载JS文件时出现问题,或者其中出现停止执行的错误,JavaScript都会重定向。

PHP重定向是最好的。因为即使用户禁用了浏览器中的脚本。

如果你使用的是noscript重定向,那么你可以选择JS而不是PHP,这样在这种情况下你就可以避免ob_start()。

如果你只想通过点击按钮将用户发送到另一个页面,为什么不实现一个链接:

<a href="searchForm.php?ticket=<?=$product?>&searchbtn=Search">go back</a>

或按钮:

<button onclick="window.location='searchForm.php?ticket=<?=$product?>&searchbtn=Search'">go back</button>

我建议采用以下方法:

function universal_redirect($url, $force_js = false) {
    if (headers_sent() || $force_js) {
        print('<script type="text/javascript">');
        printf("location.href='%s';", $url);
        print('</script>');
    } else {
        header('Location: ' . $url);
    }
}

它并不总是适用的,但如果你构建管理页面,或者当你的项目足够大和复杂,以至于你不能总是保证输出还没有开始时,它是一个很好的解决方案。

一般来说,PHP重定向要好得多,原因是@Elias Van Ootegem给出的。