代理网站中的相对网址不起作用

Kri*_*ian 3 php proxy relative-path

在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">
Run Code Online (Sandbox Code Playgroud)

问题:

http://somesite.com/assets/ico/apple-touch-icon-144-precomposed.png它实际上试图找到http://MYSITE.com/assets/ico/apple-touch-icon-144-precomposed.png错误的资产,而不是寻找资产的资产.

问题:

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

Bai*_*ker 11

怎么样的<base>标签?您可以将其放在头部,它将通知浏览器使用什么作为页面上所有相对URL的基本路径:

<head>
    <base href="http://somesite.com/">
</head>
Run Code Online (Sandbox Code Playgroud)

您可以将它添加到您提供的每个页面中DOMDocument(注意这是针对PHP5.4的,因为数组解除引用,但这对于早期版本很容易修复):

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();
}
Run Code Online (Sandbox Code Playgroud)

请注意,$ urlOfPageDir必须是页面所在目录的绝对URL.有关基本标记的更多信息,请参阅此SO问题:是否建议使用<base> html标记?