我需要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代码吗?
答案 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超全局来获取网址的各个部分。您可以随意重新排列和过滤它们。