file_get_contents()将所有本地/短链接返回为404

时间:2015-09-19 04:01:10

标签: php

我目前正在建立一个网站,这需要某种“代理”工作。基本上通过$_GET['url']我可以使用file_get_contents($url)获取网站的内容。但是,当链接显示为:<a href="images/image.png".../>时,它们将链接到我的网站而不是他们的网站,这会使我的网站加载所有图像,链接等,这会返回404未找到的错误。

我无法在任何地方找到任何相关信息。我如何在理论上做“代理”,而不是作为最终产品:

$url = $_GET['url'];
$content = file_get_contents($url);
echo $content;

我可以做些什么来改变它,所以所有链接都不依赖于浏览器看到的内容,而是它们实际来自哪里($_GET['url']中的站点链接),这基本上将相对链接转换为绝对链接?谢谢!

2 个答案:

答案 0 :(得分:0)

您必须知道他们的网站是什么,以便从中提出请求。

为此,您可以解析网址:

$urlParsed = parse_url($url);

$urlHostOnly= $urlParsed['scheme'] . "://" . $urlParsed['host'] . "/";

然后,棘手的部分,你必须在每个链接前面只添加主机URL。

html中的大多数链接都是hrefs和src值,所以这里有一个简单的替换器来处理这些。

$content = file_get_contents($url);

$replaced_content = preg_replace(
    "/(href|src)=\"((?!http[s]:\/\/[a-z\.]{2,6}).*)\"/",
    "$1=\"$urlHostOnly$2\"",
    $content
);

现在您已经更换了内容,请将其回显给客户端

echo $replaced_content;

注意:如果在输入网址时未指定正确的协议(http / https),则样式表和ssl可能会有一些冲突。

有关此示例,请参阅:http://i.imgur.com/tz6Hn28.png

答案 1 :(得分:0)

似乎我已经从朋友的建议中解决了这个问题。

//grabs the URL of the site I am working with (the $_GET['url'] site basically)
$fullUrl = basename($url); 

//Replaces <head> with <head> followed by a base-tag, which has the href attribute of the website.
//This will make all relative links absolute to that base-tag href.
$content = str_replace("<head>", "<head>\n<base href='http://" . $fullUrl . "' />", $content);

echo $content;

Voilá,这个网站现在功能完善。

<小时/> <小时/>

编辑:好的,由于某种原因,它没有完美地工作。如果链接到help.aspbasename()等文件的网址将返回help.asp。我选择了不同的路线:

function addhttp($url) {
    if (!preg_match("~^(?:f|ht)tps?://~i", $url)) {
        $url = "http://" . $url;
    }
    return $url;
}
$url = addhttp($url);
preg_match('/^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n]+)/', $url, $fullUrl);
$fullUrl = $fullUrl[1];

没有更多错误的网址被加载。这一切都工作......现在。