更改没有重定向的响应URL

时间:2011-05-25 23:39:28

标签: php html forms

是否可以在不执行重定向的情况下更改响应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");

?>

1 个答案:

答案 0 :(得分:5)

是和否。

不,因为要实际真的更改服务器端的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>
...

这应该会产生正确的网址(lost=value)。

解决方案否。 2(丑陋的):

在脚本开头覆盖$_GET数组,以欺骗应用程序,使其相信GET参数已通过。

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

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

如果你可以使用JavaScript并发出AJAX请求,这个解决方案对你来说可能是完美的(你可以例如调用你喜欢的任何URL并动态传递你需要的数据,甚至改变你提交的表单字段的值)。