是否可以在不执行重定向的情况下更改响应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");
?>
是和否
不,因为要真正地从服务器端更改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
(这里是演示),这是HTML5/JavaScript功能。
如果你可以使用JavaScript并发出AJAX请求,这个解决方案可能非常适合你(例如,你可以调用你喜欢的任何URL并动态传递你需要的数据,甚至可以更改你要提交的表单字段的值)。