2

我的站点上有一个页面,该页面从同一服务器上另一个(旧)站点的数据库中获取并显示新闻项目。某些项目包含应修复的相对链接,以便它们指向外部站点,而不是在主站点上导致 404 错误。

我首先考虑<base>在获取的新闻项目上使用标签,但这改变了整个页面的基本 URL,破坏了主导航中的相对链接——而且感觉也很hackish。

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

4

3 回答 3

3

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

于 2012-08-01T12:24:12.893 回答
3

以下是我将如何解决这个问题:

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

看到它工作

于 2012-08-01T15:16:05.893 回答
1

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

你可以开始玩ExceptionController

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

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

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

另一种解决方案是为此目的使用其控制器定义特殊路由,该路由将捕获请求index.php并进行重定向等。只需定义index.phpin requirementsof route 并将此路线移动到您的路线顶部。

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

干杯;)

于 2012-08-01T14:34:59.090 回答