2011-05-25 130 views
2

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

?> 
+5

如果你只是在'get'表单类型中将'lost'属性作为''属性放入,那会将该参数在URL上。 – Orbling 2011-05-25 23:42:47

+0

请不要在标题中写标签。 – 2011-05-25 23:50:57

+0

不幸的是,提交表单时会清除所有GET类型的参数。 – drudge 2011-05-25 23:59:23

回答

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> 
... 

,这应该引起适当的URL(与lost=value)。

解决方案没有。 2(丑陋之一):

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

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

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

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

+0

解决方案没有。 2基本上是我在我的问题中提出的,但第二个想法是否更新用户代理URL并不重要,因为就PHP而言,这是正确的。解决方案编号3没有解决我的问题,但它肯定是一个有趣的!这很可能在未来派上用场!我会玩一玩,看看它的效果如何。 – 2011-05-26 00:27:32

+0

@Lea感谢您的反馈。广告。解决方案编号2 - 是的,正确的,我刚刚发现了。你应该避免的原因是,将来它将很难调试它。广告。解决方案编号3 - 您应该知道,在大多数不推荐的浏览器(IE)中,它不起作用,您可以通过更改'window.location.hash'实现类似的目标([更多信息](https://developer.mozilla.org/en /DOM/window.location))。无论如何,解决方案没有。 1帮助你? – Tadeck 2011-05-26 00:32:46

+0

@Tadeck我完全同意你在说什么。在这种情况下,我可能很需要使用重定向解决方案。我也注意到解决方案2提示用户刷新时重新提交表单,而自动重定向避免了这个问题。当使用header('Location:xxx')发生重定向时,它会强制Web浏览器提交一个新的请求,还是Web服务器会自动执行? – 2011-05-26 00:36:07

相关问题