2

同じサーバー上の別の(レガシー)サイトのデータベースからニュースアイテムを取得して表示するページが自分のサイトにあります。一部のアイテムには相対リンクが含まれているため、メインサイトで404エラーが発生するのではなく、外部サイトに直接リンクするように修正する必要があります。

フェッチしたニュースアイテムにタグを使用することを最初に検討しました<base>が、これによりページ全体のベースURLが変更され、メインナビゲーションの相対リンクが壊れます。これもかなりハックな感じがします。

私は現在、相対URL(すべてがで始まる/index.php?)を見つけるための正規表現を作成し、それらの前に目的のベースURLを追加することを考えています。これに対するよりエレガントな解決策はありますか?このサイトはSymfony2上に構築されており、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
}

もう1つの解決策は、そのような目的のためにコントローラーを使用して特別なルートを定義することindex.phpです。これにより、リダイレクトなどへの要求をキャッチして実行します。ルートのインを定義index.phprequirements、このルートをルーティングの一番上に移動するだけです。

これまでで最も明確な答えではありませんが、少なくとも私はあなたに方向性を与えたことを願っています...

乾杯 ;)

于 2012-08-01T14:34:59.090 に答える