php重定向HTTP查询字符串变量

Gra*_*uin 36 php redirect query-string

atm我正在使用以下四行将用户重定向到我网站上的另一个页面:

<?php
    header("Status: 301 Moved Permanently");
    header("Location: ./content/index.html");
    exit;
?>
Run Code Online (Sandbox Code Playgroud)

但是使用HTTP查询字符串变量存在问题,例如http://< url >?param=blah
它们不会被理解为附加到url.

实施这个是否有明智之举?

问候

reg*_*ity 86

<?php
    header("Status: 301 Moved Permanently");
    header("Location:./content/index.html?". $_SERVER['QUERY_STRING']);
    exit;
?>
Run Code Online (Sandbox Code Playgroud)

  • 安全吗?我们需要以任何方式编码查询字符串吗? (5认同)
  • 这段代码会增加一些吗?如果没有传递查询字符串 (4认同)
  • 为了避免XSS攻击的风险,使用htmlspecialchars()清理$ _SERVER ['QUERY_STRING']是明智的. (3认同)
  • 正如@jontro 指出的,你最好使用类似的东西: header("Location:./content/index.html" . ($_GET ? "?" . $_SERVER['QUERY_STRING'] : "")); 为了避免添加额外的 ? 如果没有查询字符串。 (3认同)
  • @ nfrost21,不幸的是,如果您有多个参数,则此方法将不起作用,因为htmlspecialchars()编码&分隔符并破坏了这些参数。 (2认同)

jon*_*tro 11

要执行重定向并确保在未传递查询字符串时未显示额外的问号,请使用以下命令

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());
Run Code Online (Sandbox Code Playgroud)


jav*_*web 7

我想再添加一个选项......
无论如何 - 就像其他人说的那样,使用(.htaccess)mod_rewrite可能是最好的选择.

但是,
当你必须在PHP中执行它时,肯定有很多情况=>你有两个选择:

  1. 附加重定向URI $_SERVER['QUERY_STRING']
  2. 使用您自己构建查询附加重定向URI :http_build_query($_GET);

选项2. - 优势(+)

  • 对参数进行编码(默认为PHP_QUERY_RFC1738)
  • 你可以轻松添加(或删除)一些$_GET参数,如:(
    $_GET['new_param']="new value";添加)
    unset($_GET['param_to_remove']);(删除)
  • 如果环境(上帝知道为什么)不提供QUERY_STRING - 您可能仍然能够获得superglobal $_GET=> environmentaly independent
  • http_build_query()的第一PARAM实际上可以是任何数组或对象,以便可以建立一个$_GET从样请求$_POST$o = new YourObject();如果必要的话
  • 如有必要,您可以更改参数分隔符

选项2. - 缺点( - )

  • 这种建筑查询可能是多余的("无用"),只是不必要的......
  • 如果查询是大enaugh(可能是一些攻击?)它可能会影响性能,因为每次都会有一个数组转换为字符串&编码

有关详细信息,请参阅http://www.php.net/manual/en/function.http-build-query.php - PHP手册中有关该http_build_query()功能的网站Returns a URL-encoded string.