【问题标题】:How to write a PHP redirect script如何编写 PHP 重定向脚本
【发布时间】:2012-10-15 17:06:57
【问题描述】:

如何创建一个 PHP 脚本,以便在 URL 中添加链接时重定向到自定义 URL。例如,当用户访问这个时:

http://mydomain.com/link.php?=http://www.google.com

它应该立即将它们重定向到谷歌。

理想情况下,是否可以确保点击本身来自本地?

我知道这很可能是一个非常基本的 PHP 代码,但请注意,我对它的了解非常有限,这限制了我编写它。

【问题讨论】:

    标签: php url redirect


    【解决方案1】:

    您可以使用 $_SERVER 变量的 HTTP_REFERER 来检查它是否来自本地域。

    参考:http://php.net/manual/en/reserved.variables.server.php

    对于重定向,请尝试使用以下

    http://mydomain.com/link.php?r=http://www.google.com
    header("Location:".$_GET['r']);
    

    参考:http://in3.php.net/manual/en/function.header.php

    我希望以下内容对您有用,您可以将 $domain 变量硬编码为 mydomain.com

    $url = "http://www.php.net/index.html";
    $domain = str_ireplace('www.', '', parse_url($url, PHP_URL_HOST));
    $refDomain = str_ireplace('www.', '', parse_url($_SERVER["HTTP_REFERER"], PHP_URL_HOST));
    
    if(strcmp($domain, $refDomain) == 0)
    {
         //your code goes here
         header("Location:".$_GET['r']);
    }
    

    【讨论】:

    • 您能否在您的代码中演示如何使用 $_SERVER 变量的 HTTP_REFERER?
    • 更改 $_SERVER 中的referer 值将无济于事——客户端的浏览器将获取指定的url,而referer 将是您的站点。您无法更改此设置。
    • @MarcB,他需要确保 url 是从同一个域导航的。所以我建议使用变量 $_SERVER["HTTP_REFERER"] 来检查引用域。
    【解决方案2】:
    http://mydomain.com/link.php?url=http://www.google.com
    
    <?php
     header("Location: {$_GET['url']}");
    ?>
    

    这个?

    【讨论】:

    • 是否可以确保点击本身来自本地?
    • 作为建议,您可能希望以某种方式对 URL 进行编码,以防止人们在变量中输入他们想要的内容,然后在设置标题时对其进行解码(如 @MrSil 的回答)
    • 你可以检查一下引用域是否是mydomain.com
    • 我的意思是,我想确保访问者点击我网站中的链接。我不希望其他人在外部使用我的重定向器。
    【解决方案3】:

    好的,我想在这里添加一个完整的答案。

    您可以使用 header 发送重定向标头,就像 MrSil 所说的那样,

    header("Location: $url"); // will redirect to $url!
    

    如果您想阻止其他人使用您的重定向脚本,您可以执行以下操作:

    $ref = $_SERVER['HTTP_REFERER'];
    $host = parse_url($ref, PHP_URL_HOST);
    if($host !== "mydomain.com"){
      // out side request
    }
    

    但是,HTTP_REFERER 很容易被欺骗。那么,什么是更好的检查呢?

    CSRF 保护。这可能看起来有点矫枉过正,而且它也不是完美的方式来做这些事情,但它有帮助。

    另外,我认为不存在完美的解决方案。

    阅读this 了解有关 CSRF 的更多信息。

    【讨论】:

    • 这是一个很好的答案。出于好奇,这个脚本怎么会被欺骗?
    • 另外,您能否在其中添加标头重定向代码,以便我可以接受这个答案是正确的。抱歉,如果我感到困惑,但我看不到 $_GET['url' 部分在哪里...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2010-10-25
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    相关资源
    最近更新 更多