【问题标题】:Relative urls in a proxied website don't work代理网站中的相对 URL 不起作用
【发布时间】:2012-10-21 03:15:20
【问题描述】:

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

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

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

在响应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 找到它,这是错误的。

问题

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

【问题讨论】:

  • 您需要在通常的嫌疑人中搜索相关网址。我将从hrefsrc 属性开始。但除了这两个之外,我想不出任何更明显的地方可以找到它们。您可能会遇到使用带有相对路径的 url() 的 CSS 文件的问题,因为这将更难搜索。
  • 你说得对。我已经尽我所能来替换所有的 src 和 href 以及类似的东西。但是,一旦加载了 css 文件,这些文件的内容也将使用相对路径。因此问题:/

标签: php proxy relative-path


【解决方案1】:

&lt;base&gt; tag 怎么样?您可以将它放在头部,它会通知浏览器使用什么作为页面上所有相对 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 问题:Is it recommended to use the <base> html tag?

【讨论】:

  • 我正在研究这个,但根据我所读到的,它只适用于链接网址,对吧?
  • @Kristian 据我了解,它也适用于图像srcs、链接hrefs 和脚本srcs。
  • @Kristian 我不确定 CSS 和 javascript 中的相对 URL。你测试了吗?
  • 编辑:我错了。我没有意识到我的基本标签是在 css 资产之后但在 JS 资产之前注入的。 stackoverflow.com/questions/2161377/…
  • @Kristian 当然是的!这就说得通了。好发现!很高兴你能让一切正常!
猜你喜欢
  • 1970-01-01
  • 2019-10-05
  • 2011-01-25
  • 2011-11-23
  • 2015-06-05
  • 1970-01-01
  • 2021-02-28
  • 2019-02-02
  • 2018-11-28
相关资源
最近更新 更多