5

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

该代理输出通常包含大量具有相对 URLS 的资产,并且实际上继承了我网站的主机名,而不是代理网站:

例如: [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是错误的。

问题

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

4

1 回答 1

13

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

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

您可以将它添加到您使用的每个页面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();
}

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

于 2012-10-21T03:26:24.457 回答