仅在页面的一部分上更改基本URL

时间:2012-08-01 12:17:27

标签: php html url symfony relative-path

我的网站上有一个页面,用于从同一服务器上另一个(旧版)站点的数据库中获取和显示新闻项目。其中一些项目包含相对链接,应该修复这些项目,以便指向外部网站,而不是在主网站上造成404错误。

我首先考虑在获取的新闻项目上使用<base>标记,但是这会更改整个页面的基本网址,打破主导航中的相对链接 - 而且它也感觉非常hackish。

我目前正在考虑创建一个正则表达式来查找相对URL(它们都以/index.php?开头),并在前面添加所需的基本URL。还有更优雅的解决方案吗?该站点基于Symfony 2构建并使用jQuery。

3 个答案:

答案 0 :(得分:2)

以下是解决问题的方法:

function prepend_url ($prefix, $path) {
    // Prepend $prefix to $path if $path is not a full URL
    $parts = parse_url($path);
    return empty($parts['scheme']) ? rtrim($prefix, '/').'/'.ltrim($path, '/') : $path;
}

// The URL scheme and domain name of the other site
$otherDomain = 'http://othersite.tld';

// Create a DOM object
$dom = new DOMDocument('1.0');
$dom->loadHTML($inHtml); // $inHtml is an HTML string obtained from the database

// Create an XPath object
$xpath = new DOMXPath($dom);

// Find candidate nodes
$nodesToInspect = $xpath->query('//*[@src or @href]');

// Loop candidate nodes and update attributes
foreach ($nodesToInspect as $node) {
    if ($node->hasAttribute('src')) {
        $node->setAttribute('src', prepend_url($otherDomain, $node->getAttribute('src')));
    }
    if ($node->hasAttribute('href')) {
        $node->setAttribute('href', prepend_url($otherDomain, $node->getAttribute('href')));
    }
}

// Find all nodes to export
$nodesToExport = $xpath->query('/html/body/*');

// Iterate and stringify them
$outHtml = '';
foreach ($nodesToExport as $node) {
    $outHtml .= $node->C14N();
}

// $outHtml now contains the "fixed" HTML as a string

See it working

答案 1 :(得分:1)

您可以通过将base放在链接前面来覆盖http:\\标记。也就是说,提供一个完整的URL,而不是相对URL。

答案 2 :(得分:1)

嗯,实际上并不是解决方案,但主要是提示......

你可以开始玩ExceptionController

在那里,仅举例,您可以寻找404错误并检查追加请求的查询字符串:

$request = $this->container->get('request');
....

if (404 === $exception->getStatusCode()) {
    $query = $request->server->get('QUERY_STRING');
    //...handle your logic
}

另一个解决方案是使用其控制器为此目的定义特殊路由,这将捕获对index.php的请求并进行重定向等。只需在index.php路线中定义requirements,然后将此路线移至路线顶部。

不是一个最清晰的答案,但至少我希望我给你一个方向......

干杯;)