php 重定向与 HTTP 查询字符串变量
Posted
技术标签:
【中文标题】php 重定向与 HTTP 查询字符串变量【英文标题】:php redirect with HTTP query string variables 【发布时间】:2011-06-09 18:49:28 【问题描述】:atm 我正在使用以下四行将用户重定向到我网站上的另一个页面:
<?php
header("Status: 301 Moved Permanently");
header("Location: ./content/index.html");
exit;
?>
但是使用http://< url >?param=blah
等HTTP查询字符串变量存在问题
它们无法理解地附加到 url。
是否有明智的做法来实现这一点?
问候
【问题讨论】:
我认为您应该使用完全合格的 uri,因此请尝试使用http://domain.tld/path?get=params
而不是 /path?get=params
,否则您可能必须使用元重定向元素创建登录页面。
到底是什么问题?有几种可能的解释
对不起,这是domain.tld/path?get=params
但是我写了“”系统自动改了;)
我发现我必须删除 header(...
之前的所有缩进间距,然后它才能工作 php.net/manual/en/function.header.php 但它确实适用于从所有 htmlspecialchars($_GET['foo']...htmlspecialchars($_GET['moo']
等组装的一串查询并组装搜索查询到单个 var $bar
与 ` 。 '&' 。 ` 在他们每个人之间,所以 header("Location: $bar ");
可以在没有 htmlspecialchars()
搞砸 &
的情况下工作
【参考方案1】:
要进行重定向并确保在未传递查询字符串时不会显示额外的问号,请使用以下内容
function preserve_qs()
if (empty($_SERVER['QUERY_STRING']) && strpos($_SERVER['REQUEST_URI'], "?") === false)
return "";
return "?" . $_SERVER['QUERY_STRING'];
header("Status: 301 Moved Permanently");
header("Location: ./content/index.html" . preserve_qs());
【讨论】:
【参考方案2】:我想再添加一个选项... 无论如何 - 就像其他人所说的那样,使用 (.htaccess) mod_rewrite 可能是最好的选择。
但是,在很多情况下,您必须在 PHP 中执行此操作 => 您有两种选择:
-
使用
$_SERVER['QUERY_STRING']
附加您的重定向URI
将您的重定向 URI 添加到 您自己构建的查询:http_build_query($_GET);
选项 2. - 优点 (+)
编码参数(默认由PHP_QUERY_RFC1738) 您可以轻松添加(或删除)一些$_GET
参数,例如:$_GET['new_param']="new value";
(添加)unset($_GET['param_to_remove']);
(删除)
如果环境(天知道为什么)不提供 QUERY_STRING - 您可能仍然可以获得超全局 $_GET
=> 环境独立
http_build_query()
的第一个参数实际上可以是任何数组或对象,因此您可以根据需要从 $_POST
或 $o = new YourObject();
构建类似 $_GET
的请求
如有必要,您可以更改参数分隔符
选项 2. - 缺点 (-)
这种建筑查询可能是多余的(“没用的”),只是没有必要...... 如果查询很大(可能是一些攻击?)它可能会影响性能,因为每次都会有一个数组转换为字符串并编码有关更多信息,请参阅 http://www.php.net/manual/en/function.http-build-query.php - 关于 http_build_query()
函数的 PHP 手册站点,其中 Returns a URL-encoded string.
【讨论】:
【参考方案3】:<?php
header("Status: 301 Moved Permanently");
header("Location:./content/index.html?". $_SERVER['QUERY_STRING']);
exit;
?>
【讨论】:
安全吗?我们是否需要以任何方式对查询字符串进行编码? 为了避免 XSS 攻击的风险,明智的做法是使用 htmlspecialchars() 清理 $_SERVER['QUERY_STRING'] @nfrost21,不幸的是,如果您有多个参数,这将不起作用,因为 htmlspecialchars() 对 & 分隔符进行编码并破坏了参数。 此代码将添加一个额外的 ?如果没有传递查询字符串 正如@jontro 指出的那样,你最好使用类似: header("Location:./content/index.html" . ($_GET ? "?" . $_SERVER['QUERY_STRING'] ) ""));为了避免添加额外的 ?如果没有查询字符串。【参考方案4】:我还建议使用mod_rewrite 来完成此任务,您可以更加灵活。
【讨论】:
感谢您提供文档链接!【参考方案5】:首先为什么不使用 mod rewrite 重定向?
但无论如何,您可以将 $_SERVER['QUERY_STRING'] 连接到网址的末尾
【讨论】:
我发现 mod_rewrite 很难重定向查询字符串,除非你事先知道它们会是什么。要么,要么导致谷歌搜索过于复杂。 @decker 我认为您找到的谷歌结果过于复杂。原则上,它与接受的答案没有什么不同。除了 mod_rewrite 而不是 php。【参考方案6】:使用 $_SERVER['QUERY_STRING']
并将其附加到重定向的末尾可能就是您要查找的内容。
编辑:刚刚注意到我的回复有点晚了。
【讨论】:
【参考方案7】:添加$_SERVER['REQUEST_URI']
或QUERY_STRING
。发送print_r($_SERVER);
以查看有关请求的 URL 的更多信息。
【讨论】:
以上是关于php 重定向与 HTTP 查询字符串变量的主要内容,如果未能解决你的问题,请参考以下文章