我目前正在建立一个网站,这需要某种“代理”工作。基本上通过$_GET['url']
我可以使用file_get_contents($url)
获取网站的内容。但是,当链接显示为:<a href="images/image.png".../>
时,它们将链接到我的网站而不是他们的网站,这会使我的网站加载所有图像,链接等,这会返回404未找到的错误。
我无法在任何地方找到任何相关信息。我如何在理论上做“代理”,而不是作为最终产品:
$url = $_GET['url'];
$content = file_get_contents($url);
echo $content;
我可以做些什么来改变它,所以所有链接都不依赖于浏览器看到的内容,而是它们实际来自哪里($_GET['url']
中的站点链接),这基本上将相对链接转换为绝对链接?谢谢!
答案 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.asp
,basename()
等文件的网址将返回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];
没有更多错误的网址被加载。这一切都工作......现在。