Php 代理网站中的相对URL不';行不通

Php 代理网站中的相对URL不';行不通,php,proxy,relative-path,Php,Proxy,Relative Path,在PHP中,我编写了一个代理函数,它接受url、用户代理和其他设置。然后该函数对网站发出一个curl请求,并将带有适当html内容类型标题的输出输出输出到一个iframe中(这是必要的,因为我需要更改一些标题) 该代理输出通常有许多具有相对URL的资产,实际上包含我的站点的主机名,而不是代理站点: 例如: [http://MYSITE.com/proxy?url=http://somesite.com]将返回[http://somesite.com]的html 在响应html中,有如下内容: &

在PHP中,我编写了一个代理函数,它接受url、用户代理和其他设置。然后该函数对网站发出一个curl请求,并将带有适当html内容类型标题的输出输出输出到一个iframe中(这是必要的,因为我需要更改一些标题)

该代理输出通常有许多具有相对URL的资产,实际上包含我的站点的主机名,而不是代理站点:

例如: [http://MYSITE.com/proxy?url=http://somesite.com]将返回[http://somesite.com]的html

在响应html中,有如下内容:

<link rel="apple-touch-icon-precomposed" sizes="144x144" href="assets/ico/apple-touch-icon-144-precomposed.png">

问题:

而不是在
http://somesite.com/assets/ico/apple-touch-icon-144-precomposed.png
,它实际上试图在
http://MYSITE.com/assets/ico/apple-touch-icon-144-precomposed.png
哪一个是错误的

问题

我需要做什么才能通过代理正确加载它们的相对路径资产?

如何?您可以将其放置在头部,它将通知浏览器使用什么作为页面上所有相关URL的基本路径:

<head>
    <base href="http://somesite.com/">
</head>

请注意,$urlOfPageDir必须是页面所在目录的绝对URL。有关基本标记的更多信息,请参见此SO问题:

您需要搜索常见的可疑URL。我将从
href
src
属性开始。但除了这两个,我想不出还有什么更明显的地方可以找到它们。您可能对使用相对路径的
url()
的CSS文件有问题,因为这将更难搜索。您完全正确。我已经尽力更换了所有的src和href以及类似的。但是,一旦加载了css文件,这些文件的内容也会使用相对路径。因此产生了一个问题:/我一直在研究它,但根据我所读到的,它只适用于链接URL,对吗?@Kristian据我所知,它也适用于image
src
s、link
href
s和script
src
s。@Kristian我不确定CSS和javascript中的相对URL。你测试过了吗?编辑:我错了。我没有意识到我的基本标签是在css资产之后注入的,但在JS资产之前注入的@克里斯蒂安:是的,当然!这是有道理的。好发现!很高兴你能把一切都做好!
if($contentType == 'text/html') {
    $doc = DOMDocument::loadHTML($html);
    $head = $doc->getElementsByTagName('head')[0];

    if(count($head->getElementsByTagName('base')) == 0) {
        $base = DOMDocument::createElement('base');
        $base->setAttribute('href', $urlOfPageDir);
    }

    $head->appendChild($base);
    echo $doc->saveHTML();
}