【问题标题】:How to redirect to the same page in PHP如何在PHP中重定向到同一页面
【发布时间】:2011-12-29 04:20:57
【问题描述】:

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

比如我在本地的网址是:

http://localhost/myweb/index.php

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

header("Location: clients.php");

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

有没有办法做这样的事情?另外,我有很多代码,然后在处理完一些代码后最后......我正在尝试使用它进行重定向。可以吗?

【问题讨论】:

标签: php redirect


【解决方案1】:

有许多不同的$_SERVER (docs) 属性可以返回有关当前页面的信息,但我的首选方法是使用$_SERVER['HTTP_HOST']

header("Location: " . "http://" . $_SERVER['HTTP_HOST'] . $location);

其中$location 是域之后的路径,以/ 开头。

【讨论】:

  • 我不知道为什么它没有重定向,也许我做错了? $location= '/index.php'; header("位置:" . "http://" . $_SERVER['HTTP_HOST'] .$location);
  • 为了调试,只需输出带有echo而不是header的字符串。如果它是正确的,那么其他地方是错误的(例如,标题必须是页面上的第一个输出。)
【解决方案2】:

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

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

别忘了在你的 header() 之后死掉或退出;

编辑:(感谢@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';

【讨论】:

  • 如果查询字符串也需要,使用header('location:'.$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']); exit;
  • @RafaelBarros 谢谢你,我已经编辑了我的答案以包含你的建议。
  • 如果您使用 .htaccess 将 URL 重定向到单个文件,这将重定向到该单个文件,而不是浏览器中的 URL。
  • 我对 & 符号有疑问。解决方案:header('Location:'. $_SERVER['PHP_SELF'].'?'. str_replace("&","&",$_SERVER['QUERY_STRING']));die;
  • @HugoDelsing 如果您要重定向到请求处理程序,您可以设置$_SERVER['PHP_SELF'] = 'whatever you want'; 我通常在请求处理程序本身中执行此操作,并从一些手动配置值和$_SERVER['REQUEST_URI'](在每个/通过正则表达式之间拆分)。这让我可以不用担心从上面使用我的重定向代码,还可以让我对友好的 url 格式进行精细控制。因此,当 htaccess url 操作正在进行时,请使用 $_SERVER['REQUEST_URI'],如果需要,您可以使用它为 $_SERVER['PHP_SELF'] 分配正确的值。
【解决方案3】:

另一个优雅的是

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

【讨论】:

    【解决方案4】:

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

    $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://stackoverflow.com/a/2886224/947370的https检测

    【讨论】:

    • 这个很有帮助。
    【解决方案5】:
    header('Location: '.$_SERVER['PHP_SELF']);  
    

    也可以

    【讨论】:

      【解决方案6】:

      我在 localhost 中正确使用:

      header('0');
      

      【讨论】:

      • 这不会重新加载页面。
      【解决方案7】:

      如果您不关心查询参数,这是一种快速简便的方法:

      header("location: ./");
      

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

          下面的简单行就可以了:

          header("Location: ?");
          

          【讨论】:

            猜你喜欢
            • 2011-06-26
            • 1970-01-01
            • 1970-01-01
            • 2013-03-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-06
            相关资源
            最近更新 更多