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://&lt; url &gt;?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() 搞砸 &amp; 的情况下工作 【参考方案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 查询字符串变量的主要内容,如果未能解决你的问题,请参考以下文章

带有查询字符串的 URL 重定向 - htaccess

使用查询字符串在新服务器上重定向的角度路由

Nginx配置rewrite重定向跳转

如果任何目录具有特定的查询字符串,则重定向

浏览器如何使用查询字符串缓存 301 重定向

php 过滤以在提交或重定向时从URL中删除联系表单7查询字符串。进入函数文件。