PHP外部链接帮助

时间:2010-11-23 12:58:17

标签: php

您好我有以下页面,它使用当前URL和简单的外部链接设置cookie。

<?php

function pageURL()
    {
        $pageURL = 'http';
        if ($_SERVER["HTTPS"] == "on")
        {
            $pageURL .= "s";
        }
        $pageURL .= "://";
        if ($_SERVER["SERVER_PORT"] != "80")
        {
            $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
        } 
        else
        {
            $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
        }
        return $pageURL;
    }

    $CurrentPage = pageURL();

    setcookie('linkback', $CurrentPage);

?>

<p><a href="http://www.google.com/">External Link</a></p>

我想要做的是使用PHP为所有外部链接添加前缀,以便它们具有以下结构:

localhost/outgoing?url=http://www.google.com/

这会加载一个外发页面,如下所示:

    <?php

    if(!isset($_GET['url']))
    {
        header('HTTP/1.0 404 Not Found');
    }

    ?>

<h1>Warning! Now leaving website</h1>

    <ul>
                <li><a title="Return to Website" href="<?php if(isset($_COOKIE['linkback'])) { echo $_COOKIE['linkback']; } else { echo 'http://localhost:8888/creathive/'; } ?>">Return to Website</a></li>
                <li><a title="Continue to <?php echo $_GET['url']; ?>" href="<?php echo $_GET['url']; ?>">Continue to <?php echo $_GET['url']; ?></a></li>
            </ul>

这个想法是使用上一页中设置的cookie我可以有一个简单的后退按钮,并从查询中获取URL并允许用户在被警告他们离开网站后继续。

我遇到的问题是:

1。)为外部URL添加前缀,以便它们转到外发页面

2。)如果用户在没有网址查询字符串的情况下访问传出页面但是不是

,则传出页面顶部的isset应该抛出404

3.。)需要确保URLS有效,例如防止这种情况发生:localhost/outgoing?url=moo

4 个答案:

答案 0 :(得分:0)

您需要根据新方案替换代码中的每个外部URL。没有办法为所有传出链接执行此自动操作。

这是因为,如果用户点击外部网址,请求不会发送到您的服务器,而是发送给外部服务器。

修改 您唯一能做的就是使用ob_start()缓存所有输出,然后使用正则表达式替换所有链接,然后再将其打印到页面上。

但更好的解决方案是自己更换所有链接。

答案 1 :(得分:0)

  1. 你能详细说明吗?

  2. Isset不是“正确”的工具。尝试arrya_key_exists('url',$ _GET)......像这样的代码应该做你。

  3.     function haveUrl() {
                if (array_key_exists('url', $_GET)) {
                $url = $_GET['url'];
                if (!empty($url)) return true;
            }
            return false;
        }
    
    1. 您只需检查它们是否以http://或https://开头...这可以通过正则表达式来完成....类似......
    2.     function validUrl($url) {
              if (preg_match('\^(http:\/\/|https:\/\/)\mi', $url) {
                  if (preg_match('\localhost\mi', $url) return false;
                  else return trus;
              }
              return false;
          }
      

答案 2 :(得分:0)

1)我会为所有链接创建一个类,并使用类似$ links-&gt; create(“http:// ...”)的内容 在那里你可以放置重定向和你可能需要的一切。

3)

您可以使用以下链接中的代码: link text

答案 3 :(得分:0)

  

1。)为外部URL添加前缀,以便它们转到外发页面

你需要一个DOM工具。例如,SimpleXMLSimple HTML DOM parser或其中任何一种操作您正在呈现的页面上的外向链接。 (在this question中查找更多可用选项。)

最理想的情况是,您将缓存此操作的结果,因为它可能非常昂贵(读取:慢)并在更新时或在定义的时间段后更新缓存版本。

  

2。)如果用户在没有网址查询字符串的情况下访问传出页面但是不是

,则传出页面顶部的isset应该抛出404

是的,但是如果您不想渲染页面的其余部分,则需要在此之后停止执行。 404错误可以 - 而且应该! - 有一个页面主体,它像任何其他HTTP响应一样响应。

  

3.。)需要确保URLS有效,例如防止发生这种情况:localhost / outgoing?url = moo

即使您这样做 - 确实应该这样做,也不会阻止任何人通过手动URL操作访问localhost/outgoing?url=foo。 Url参数或任何其他用户输入永远不可信任。换句话说,无论如何,您都需要检查传出脚本中的传出URL。

不要忘记严格消毒!像这样的功能是尖叫被滥用。