使用PHP创建规范

时间:2011-01-29 16:03:02

标签: php html xhtml seo

我需要PHP代码在<link />标记内生成动态规范网址,如下所示:

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

我的网站使用PHP生成变量,如下所示:

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

我希望能够返回删除&pointlessvar=narrow

的规范网址

以我认为合适的方式重新排列变量,如下所示:

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

我想为SEO目的这样做,因为我的网站包含许多不同顺序的变量,这些变量为基本相同的内容提供不同的URL(以防止SERPS中的重复并集中链接汁)

有人可以推荐一些我可以放在<link />标签中的PHP代码吗?

4 个答案:

答案 0 :(得分:2)

$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提供了更多的排序功能 他们甚至允许您编写自己的custom sort function

答案 1 :(得分:2)

要制作规范网址,您应该确保,您只获得了所需的参数,并将它们按固定顺序排列。这段代码就是这样。它过滤_GET参数列表并构建一个只包含所需URL的新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 :(得分:1)

您可以将parse_url();功能与http_build_query()混合以重建您的网址。

$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重建。

答案 3 :(得分:0)

您可以使用$ _SERVER超全局和$ _GET超全局来获取网址的各个部分。您可以随意重新排列和过滤它们。