如何在PHP中重定向到同一页面

37

如何使用PHP重定向到同一页?

例如,我的本地web地址是:

http://localhost/myweb/index.php

我该如何在我的网站内重定向到另一个页面,比如说:

header("Location: clients.php");

我知道这可能是不正确的,但是我真的需要放整个东西吗?如果以后不是http://localhost/怎么办?

有没有办法做到这样的事情?此外,在处理完一些代码后,我尝试使用重定向。可以这样做吗?


可能是重复的问题:如何在PHP中进行重定向? - David Harkness
1
这与“同一页”有什么关系? - Jim H.
对于“同一页”,我在这里找到了最强大的答案:https://dev59.com/62855IYBdhLWcg3wpmHw - eselk
9个回答

97

我在重新加载同一页面时首选的方法是使用 $_SERVER['PHP_SELF']。

header('Location: '.$_SERVER['PHP_SELF']);
die;

在调用header()函数后,不要忘记使用die或exit终止程序执行。

编辑:(感谢@RafaelBarros)

如果查询字符串也是必需的,请使用

header('Location:'.$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']);
die;

编辑:(感谢@HugoDelsing)

当htaccess URL操作生效时,$_SERVER ['PHP_SELF']的值可能会将您带到错误的位置。在这种情况下,正确的URL数据将在$_SERVER ['REQUEST_URI']中进行重定向,可以像下面Nabil的答案那样:

header("Location: http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
exit;

如果需要,您还可以使用 $_SERVER[REQUEST_URI] 将正确的值分配给 $_SERVER['PHP_SELF']。 如果您经常使用重定向函数并且不想更改它,则可以使用此方法。 只需在请求处理程序中设置正确的值:

$_SERVER['PHP_SELF'] = 'https://sample.com/controller/etc';

8
如果查询字符串也是必要的,则使用 header('location:'.$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']); exit; - Rafael Barros
2
@RafaelBarros 谢谢你的建议,我已经编辑了我的答案并包含了你的建议。 - Syntax Error
4
如果您使用.htaccess将URL重定向到单个文件,则会重定向到该单个文件,而不是浏览器中的URL。 - Hugo Delsing
我遇到了和“&”相关的问题。解决办法是:header('Location:'。 $ _SERVER ['PHP_SELF']。'?'. str_replace("&","&",$ _SERVER ['QUERY_STRING'])); die; - houssam
@SyntaxError PHP_SELF有一个函数,而REQUEST_URI也有一个函数。我永远不会更改服务器变量,因为在将来跟踪该值为什么不符合预期将非常困难。 - Hugo Delsing
显示剩余6条评论

19

另一个优雅的例子是

header("Location: http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
exit;

12
有许多不同的$_SERVER (docs) 属性可以返回有关当前页面的信息,但我更喜欢使用$_SERVER['HTTP_HOST']方法:
header("Location: " . "http://" . $_SERVER['HTTP_HOST'] . $location);

在这里,$location是域名后面的路径,以/开头。

我不确定为什么它没有重定向,也许是我做错了吗? $location= '/index.php'; header("Location: " . "http://" . $_SERVER['HTTP_HOST'] .$location); - user710502
1
为了调试,请使用 echo 输出该字符串,而不是 header。如果输出正确,则可能存在其他问题(例如,头必须是页面上的第一个输出)。 - Nicole

10

为了真正实现通用性,我正在使用这个:

$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' 
    || $_SERVER['SERVER_PORT'] == 443) ? 'https://' : 'http://';
header('Location: '.$protocol.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
exit;

我喜欢$_SERVER['REQUEST_URI'],因为它尊重mod_rewrite和/或任何GET变量。

来自https://dev59.com/LXM_5IYBdhLWcg3w6HvT#2886224的https检测。


这很有帮助。 - Amir Iqbal
我是说,到2022年,我认为我们几乎在所有情况下都应该专门重定向到https - 但现在我会保留这个答案。 - squarecandy

5

如果您不关心查询参数,可以采用快速简单的方法:

header("location: ./");

2

下面这条简单的线路可以正常工作:

header("Location: ?");

2
header('Location: '.$_SERVER['PHP_SELF']);  

也可以工作


对我来说失败了。给我返回当前目录的目录列表。 - David Spector

1
我刚试过使用header("Location: ");(没有任何值),它会重定向到当前页面。

1
提供目标地址已经过时了,因为在Internet Explorer中,空白的URL会将用户重定向到当前文件夹的根目录,例如“Location: ./”。但现代的Webkit浏览器不会这样做。 - tim

-2

我在本地使用得很正确:

header('0');

这不会重新加载页面。 - rybo111

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接