【问题标题】:Redirect all GET queries from one site to another将所有 GET 查询从一个站点重定向到另一个站点
【发布时间】:2012-02-19 10:54:59
【问题描述】:

假设我想使用PHP 将所有GET 查询从一个站点重定向到另一个站点。
POST 查询在系统中不存在。

例如,当用户连接到

www.mysite.com/index.php?action=myAction&pageno=2

我希望他被重定向到:

www.mySecondSite.com/index.php?action=myAction&pageno=2

我可以为每个可能的$_GET 变量(在我的示例中为myActionpageno)编写一个硬编码代码,但这听起来不是一个合理的解决方案。此外,我还看到了this 解决方案,其中涉及修改 Apache 服务器的配置。假设我不能更改服务器配置。

当然,必须有办法获取所有变量及其值,并将其重定向到另一个站点。

【问题讨论】:

    标签: php url get


    【解决方案1】:

    首先你需要获取完整的URL,例如我的本地服务器:

    http://localhost/server_var.php?foo=bar&second=something
    

    尝试使用print_r() 打印$_SERVER 变量:

    print_r( $_SERVER);
    

    你应该得到这样的结果:

    Array
    (
        ...
        [REQUEST_URI] => /server_var.php?foo=bar&second=something
        ...
    )
    

    欲了解更多信息,请查看manual page,现在您有了自己的网址:

    $url = 'http://www.mySecondSite.com' . $_SERVER['REQUEST_URI'];
    

    您可以使用header() 重定向您的请求:

    header( 'Location: ' . $url);
    

    我建议你看看HTTP status codes3xx,无论你是想使用302 Found(默认)还是307 Temporary Redirect...

    第二种特殊情况是“Location:”标头。不仅如此 将此标头发送回浏览器,但它也返回一个 REDIRECT (302) 状态码到浏览器,除非是 201 或 3xx 状态码 已经设置好了。

    所以你可以这样做:

    header('HTTP/1.0 307 Temporary Redirect');
    header( 'Location: ' . $url);
    

    【讨论】:

    • @yes123 我已经提供了我的回答来源...这是“w3c on HTTP 代码”他们声称 307 Temporary Redirect302 Found...(请单击 HTTP 状态代码链接) 我个人认为 w3.org 比 wiki 更可靠。
    • 两者之间的区别非常微妙。我个人会坚持使用 302 进行临时重定向
    • @yes123 我也没有改变它,但它的意思是“如果你有兴趣,你可以在这里获得更多信息”,以防他将来需要它。 + 对于永久重定向 (301),值得知道有更多的状态不仅仅是 302。再次。本来是作为学习材料的:)
    • @Andrey 我建议研究所有$_SERVER 子变量(和键),以防万一你不需要整个REQUEST_URI 左右:)
    【解决方案2】:

    在 index.php 页面顶部的 html 标记之前编写此 php 代码。

    <?
    $newUrl = "www.mySecondSite.com/index.php";
    if (!empty($_GET)){
    $parameter = $_GET;
    $firstTime = true;
    foreach($parameter as $param => $value){
        if ($firstTime) {
            $newUrl .= "?" . $param . "=" . $value;
            $firstTime = false;
        } else {
            $newUrl .= "&" . $param . "=" . $value;
        }
    }
    }
    header("Location: ".$newUrl);
    /* Make sure that code below does not get executed when we redirect. */
    exit;
    ?>
    

    【讨论】:

    • 出于好奇,您是否有理由不使用 http_build_query($_GET) 而不是循环?
    【解决方案3】:

    在 .htaccess 中重定向是可行的方法,但如果您说无法更改,则可以在 index.php 文件中插入带有 301 代码的条件标头: http://php.net/manual/en/function.header.php

    $_SERVER['QUERY_STRING'] 中提供了查询字符串的内容

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-25
      • 2021-09-07
      • 1970-01-01
      • 2019-11-14
      • 1970-01-01
      • 2010-11-28
      相关资源
      最近更新 更多