在php中使用元刷新标记重定向而不是header()函数是一种好习惯吗?

时间:2010-12-25 05:21:48

标签: php header refresh redirect

我必须在我的脚本中大量使用重定向,例如在用户登录后我需要将它们重定向到管理区域等等。但是我觉得总是必须让头部功能处于最顶端是不方便的。因此,如果我使用元刷新标签进行重定向,那么根据最佳实践会不会满足于这一点,还是可以接受?

function redirect($location) {
    echo "<meta http-equiv='refresh' content='0; url=$location' />";
}

4 个答案:

答案 0 :(得分:10)

否。 Wikipedia明确指出:

  

元刷新是一种不鼓励的方法,用于指示Web浏览器在给定的时间间隔后自动刷新当前的网页或帧.......

元刷新标签有一些缺点

  1. 如果页面重定向过快(少于2-3秒),使用下一页上的“后退”按钮可能会导致某些浏览器返回重定向页面,重定向将再次发生。这对可用性不利,因为这可能会导致读者在最后一个网站上“卡住”。
  2. 读者可能希望或不希望被重定向到不同的页面,这可能导致用户不满或引起对安全性的担忧。

答案 1 :(得分:1)

我个人会使用header()函数,然后用户不必等待另一个页面加载。

答案 2 :(得分:0)

我个人使用header()函数,但Meta只是将页面刷新到该url而不是重定向,因此它有可能杀死cookie /会话,而header()仅在没有任何帖子发布时才有效您使用它之前的网站。他们都有起伏。

答案 3 :(得分:0)

这取决于您的需求。

如果您必须在登录后重定向用户,则必须使用标题重定向。

由于上述原因,不建议使用元刷新,但如果需要,则可以使用元刷新。例如,在您的网站上展示广告,然后在一定的秒数后强制下载文件或重定向到新网页。

这是一个小场景

PHP

login.php页面显示登录表单,提交后该页面将数据发布到clearn_login_form.php以清理输入。 clearn_login_form.php重定向到validate.php,然后validate.php重定向到admin_area/admin_main.php

所有这些重定向都在后端完成,用户只会看到login.phpadmin_main.php页面,如果用户按下浏览器的后退按钮,它将返回login.php

META

在元刷新中,重定向在浏览器/客户端完成,这存在安全风险,因为用户将能够在其URL中看到clear_login_form.phpvalidate.php。如果他们从admin_main.php回击按钮,他们将从validate.php到达,他们将再次重定向到admin_main.php

PHP安全且快速,并且会隐藏用户的一些重要文件名,其中meta被暴露,用户可以进行CSRF或会话劫持攻击(如果他们发现任何漏洞)

现在你必须在第一行使用标题是一个问题,要克服这个问题使用ob_start()函数。但请确保在每个标头命令后放置exit()

注意:ob_startheader()合并不是一个好习惯,它会让处理代码的其他程序员感到困惑。建议在最顶层的位置使用标头,或者在将任何输出发送到浏览器之前使用标头

function redirect($location) { header("location: $location"); exit(); }