【问题标题】:PHP Redirect Back To Where User WasPHP重定向回用户所在的位置
【发布时间】:2020-07-09 21:23:42
【问题描述】:

假设我有这个脚本:

http://www.example.com/profile.php?uid=12345

在这个脚本中,有一个由 sendmessage.php 处理的发送消息功能。 sendmessage.php 实际所做的是将某些内容插入到数据库中,然后重定向回用户开始的位置(profile.php?uid=12345)。

我尝试使用标题(“位置:profile.php”)。

但由于 profile.php 在 URL 中需要 ?uid=12345 [而且它是动态的],因此我的重定向计划不起作用。

如何“传递”当前 URL。在我的情况下,使用 GET 方法将 'profile.php?uid=12345' 发送到 sendmessage.php。然后,一旦 sendmessage.php 完成处理,将用户返回到他们自己的屏幕 (profile.php?uid=12345)?

提前致谢。

【问题讨论】:

    标签: php


    【解决方案1】:

    试试这个:

    header("Location: " . $_SERVER['HTTP_REFERER']);
    

    来自 PHP.net 的注释:

    The address of the page (if any) which referred the user agent to the current page. This is set by the user agent. Not all user agents will set this, and some provide the ability to modify HTTP_REFERER as a feature. In short, it cannot really be trusted.

    【讨论】:

    • 我想我记得读到的referer值并不总是填充,是这样吗?
    • 是的,但它是获取 URL 的唯一服务器端方式,无需将先前的 URL 传递到 $_POST 或 $_GET 变量。
    • 它说:不是所有的用户代理都会设置这个。好吧,什么不是? IE、Safari 还是..?
    • 所有已建立的浏览器(即所有桌面浏览器和大多数移动浏览器)都会设置它。措辞只是说它是客户端的事情,并且 - 就像网络编程中的很多东西一样 - 你没有任何保证它被设置。它非常适合您的需求。
    • @RobertHanson 看这篇文章,尤其是Referer Hiding 部分:en.wikipedia.org/wiki/HTTP_referer 老实说,我真的建议将重定向返回 URL 作为 $_POST 或 $_GET 参数传递给 PHP 以进行重定向回到。 HTML5 提供了在发送请求中不包含此标头的选项,这将阻止 PHP 访问此信息。
    【解决方案2】:

    如果您使用表单将数据发送到sendmessage.php,请在您的profile.php?uid=12345 中 那么你可以有一个隐藏字段,比如 -

    <input type="hidden" name="redirect_to" value="<?=$_SERVER['REQUEST_URI']?>">

    那么在sendmessage.php你可以使用header("Location: ".$_REQUEST['redirect_to']);'

    【讨论】:

    • 不幸的是,就我而言,我没有使用 FORM 来提交数据。所以输入标签将不适用。但我同意你的解决方案,使用 $_SERVER['REQUEST_URI'],只是还在想如何在没有 Inout 标记的情况下传递它。有什么帮助吗?
    • 我认为当您不使用输入标签时,您可以制作 redirect_to 类型的 url 参数,并在编码后为其赋予 $_SERVER["REQUEST_URI"] 的值,并在需要时对其进行适当解码
    • .... 像 sendmessage.php?redirect_to=urlencode($_SERVER["REQUEST_URI"]) 和 sendmessage.ph 你可以做 urldecode($_GET["redirect_to"]) ... .. 可能需要进行一些测试,因为我很久以前就使用过类似的东西
    【解决方案3】:

    一个技巧是在链接本身中填充信息,这样当您转到不同的页面时,这些参数仍然存在......如果您愿意,您可以使用一个参数作为以前的 url。

    【讨论】:

      【解决方案4】:

      另一种选择是确保将 uid 作为表单提交数据的一部分发送。

      然后你可以使用传入的值重构 URL:

      header("位置:profile.php?uid=".$_GET["uid"]);

      或者,将用户 ID 存储在他们的会话中。这样一来,它始终在 $_SESSION["uid"] 中可用,并且您不必记住在表单中创建其他无关字段。

      【讨论】:

        【解决方案5】:

        你应该将变量传递给 sendmessage.php 像

        sendmessage.php?uid=<?php echo (isset($_GET['uid']) ? (INT)$_GET['uid'] : 'default') ?>
        

        然后在 sendmessage.php 上。使用类似

        header("Location: profile.php?uid=" . (isset($_GET['uid']) ? (INT)$_GET['uid'] : 'default') ); 
        

        【讨论】:

          【解决方案6】:

          您可以使用 GET 和一些 javascript。使用这种方法可以避免使用 PHP 的 header 函数的问题。

          echo "<script type=\"text/javascript\"> window.location = \"profile.php?uid=" . $_GET["uid"] .    "\"</script>";
          

          确保检查“uid”是否实际通过。您还可以在用户首次登录时将 uid 存储在会话变量中,然后在我的示例中使用它,从而避免使用 GET。无论哪种方式都有效。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-11
            • 2018-08-18
            • 2016-12-15
            • 2014-10-05
            • 2016-05-08
            • 2014-04-05
            相关资源
            最近更新 更多