【问题标题】:Change Response URL without Redirect更改响应 URL 而不重定向
【发布时间】:2011-05-25 23:39:27
【问题描述】:

是否可以在不执行重定向的情况下更改响应 URL?

略长一点的故事……

由于 HTML 表单的限制,以下内容不起作用,因为来自操作 URL 的查询字符串未提交给服务器:

<?php // handler.php ?>
...
<form action="handler.php?lost=value" method="get">
    <input type="text" name="filter-keyword" value="" />
    <input type="submit" name="do-submit" value="Submit" />
</form>
...

所以我决定改用 post 方法并创建一个单独的过滤器处理程序脚本,它只是为“handler.php”文件构造正确的查询字符串。

<?php // handler.php ?>
...
<form action="filter-handler.php" method="post">
    <input type="hidden" name="preserve-qs" value="lost=value" />
    <input type="text" name="filter-keyword" value="" />
    <input type="submit" name="do-submit" value="Submit" />
</form>
...

// filter-handler.php
<?php
    $new_url = 'handler.php?filter-keyword=' . $_POST['filter-keyword'];
    if (isset($_POST['preserve-qs']) && $_POST['preserve-qs'] != '')
        $new_url .= '&' . $_POST['preserve-qs'];

    header("Location: $new_url");
?>

是否可以在不执行重定向的情况下实现这一目标?

// filter-handler.php
<?php
    $qs_args = array(
        'filter-keyword' => $_POST['filter-keyword'];
    );
    if (isset($_POST['preserve-qs']) && $_POST['preserve-qs'] != '')
        parse_str($_POST['preserve-qs'], $qs_args);

    // Fake query string.
    $_GET = $qs_args;

    // handler script is blissfully unaware of the above hack.
    include('handler.php');


    // ???? HOW TO UPDATE QUERY STRING IN BROWSER ADDRESS BAR ????

    // Following no good because it redirects...
    //header("Location: $new_url");

?>

【问题讨论】:

  • 请不要在标题中写标签。
  • 很遗憾,任何GET-type 参数在提交表单时都会被清除。
  • @Tomalak 谢谢你的提示,我会记住的:-)

标签: php html forms


【解决方案1】:

是和不是。

不,因为要真正真正从服务器端更改 URL,您必须进行重定向。

是的,因为您的问题还有其他解决方案。

解决方案编号。 1:

将您的代码从第一个示例更改为:

<?php // handler.php ?>
...
<form action="handler.php" method="get">
    <input type="hidden" name="lost" value="value" />
    <input type="text" name="filter-keyword" value="" />
    <input type="submit" name="do-submit" value="Submit" />
</form>
...

这应该会产生正确的 URL(带有lost=value)。

解决方案编号。 2(丑一):

覆盖脚本开头的 $_GET 数组,以欺骗应用程序相信 GET 参数已传递。

解决方案编号。 3(关于更改URL而不重定向):

此解决方案可能不适合您,但它实际上模仿了更改 URL。它不在服务器端,但它实际上更改了用户的 URL。这称为pushState(演示here),这是HTML5 / JavaScript 功能。

如果您可以使用 JavaScript 并发出 AJAX 请求,那么此解决方案可能非常适合您(例如,您可以调用您喜欢的任何 URL 并动态传递您需要的数据,甚至更改您要提交的表单字段的值)。

【讨论】:

  • 解决方案编号2本质上是我在我的问题中提出的,但再次考虑是否更新用户代理URL并不重要,因为就PHP而言将是正确的。解决方案编号3 并没有解决我的问题,但它肯定是一个有趣的问题!将来很可能会派上用场!我会玩一玩,看看效果如何。
  • @Lea 感谢您的反馈。广告。解决方案编号2 - 是的,正确,我刚刚发现了这一点。您应该避免这种情况的原因是将来调试它会非常困难。广告。解决方案编号3 - 您应该知道,在大多数已弃用的浏览器 (IE) 中它不起作用,您可以通过更改 window.location.hash (see more) 来实现类似的目标。无论如何,没有解决方案。 1 帮你?
  • @Tadeck 我完全同意你所说的。在这种情况下,我很可能需要使用重定向解决方案。我还注意到解决方案 2 在刷新时提示用户重新提交表单,而自动重定向避免了这个问题。当header('Location: xxx') 发生重定向时,它是强制网络浏览器提交新请求,还是网络服务器自动提交?
  • Location HTTP 标头 (see docs) 被发送到浏览器作为关于去哪里查找内容的信息。重定向发生在浏览器端。
  • 感谢@Tadeck,这帮助我找到了解决方案。我将不得不使用重定向,但我将创建一个非常简单的重定向脚本,以避免加载核心文件。
猜你喜欢
  • 2011-01-02
  • 2015-04-02
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多