Создание канонического с PHP - PullRequest
1 голос
/ 29 января 2011

Мне нужен код PHP для генерации динамического канонического URL в теге <link /> следующим образом:

<link rel="canonical" href="php goes here" />

Мой сайт использует PHP для генерации переменных следующим образом:

http://www.mysite.com/script.php?var1=blue&var2=large&pointlessvar=narrow

Я хочу иметь возможность вернуть канонический URL, который удаляет &pointlessvar=narrow

И переупорядочивает переменные так, как я считаю нужным, вот так:

<link rel="canonical" href="http://www.mysite.com/script.php?var2=large&var1=blue" />

Я хочу сделать это для целей SEO, так как мой сайт содержит много переменных в разных порядках, которые дают разные URL-адреса для практически одного и того же контента (чтобы предотвратить дублирование в SERPS и сконцентрировать сок ссылок)

Кто-нибудь может предложить какой-нибудь код PHP, который я могу поместить в тег <link />?

Ответы [ 4 ]

2 голосов
/ 29 января 2011

Чтобы создать канонический URL-адрес, вы должны убедиться, что у вас есть только нужные параметры, и вы также должны установить их в фиксированном порядке. Этот код делает это. Он фильтрует список параметров _GET и создает новый URL только с нужными. Я добавил несколько комментариев, чтобы вы могли легко настроить этот код в соответствии со своими потребностями.

Я использую array_filter, потому что я не уверен, что произойдет, если вы сбросите элементы массива в пределах foreach в массиве.

function params()
{
    return array('b', 'c', 'a', 'z');
}

function checkParam($a)
{
    // Checks if key $a is in array of valid parameters
    return in_array($a, params());
}

function compare($a, $b)
{
    return array_search($a, params()) - array_search($b, params());
}

function getCanonicalUrl()
{
    $querystring = '';

    // Copy and flip the array to allow filtering by key.
    $params = array_flip($_GET);

    // Filter out any params that are not wanted.
    $params = array_filter($params, 'checkParam'); 

    // If none remain, we're done.
    if (count($params) !== 0)
    {
        // Sort the rest in given order
        uasort($params, 'compare');
        // Create a query string. Mind, name and value are still flipped.
        $querystring = '?'.http_build_query(array_flip($params));
    }

    return 
        'http://'.
        // $_SERVER['HTTP_HOST'] .
        $_SERVER['SCRIPT_NAME'] .
        $querystring;
}

print getCanonicalUrl();
2 голосов
/ 29 января 2011
$path = "http://www.mysite.com/script.php?var1=blue&var2=large&pointlessvar=narrow";
$url = parse_url($path, PHP_URL_QUERY); // Fetch the query component of a url

// Put the query into an array with the var name as the key
parse_str($url, $query=array()); 

foreach ($query as $name=>$val) {
    // Check for pointless vars and unset() them here
}

krsort ($query); // Sort by array keys in reverse order.

$pathex = explode('?', $path, 2);
$npath = $pathex[0] . '?' . http_build_query($query);

Есть больше функций сортировки, доступных по php.
Они даже позволяют вам написать свою собственную пользовательскую функцию сортировки .

1 голос
/ 29 января 2011

Вы можете смешать функции parse_url(); и http_build_query(), чтобы восстановить ваш URL.

$url = 'http://www.mysite.com/script.php?var1=blue&var2=large&pointlessvar=narrow';
$url = parse_url($url);

$params = array();
$tmpParams = explode('&',$url['query']);

foreach ($tmpParams as $param) {
    $tmp = explode('=', $param);
    $params[$tmp[0]] = (!empty($tmp[1])) ? $tmp[1] : null;
}

Затем переберите $ params, чтобы сбросить ненужные переменные, а затем пересоберите с помощью http_build_query.

0 голосов
/ 29 января 2011

Вы можете использовать суперглобальный $ _SERVER и суперглобальный $ _GET, чтобы получить различные части URL.Вы можете переставить и отфильтровать их так, как вам нравится.

...