Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用PHP创建规范_Php_Html_Xhtml_Seo - Fatal编程技术网

用PHP创建规范

用PHP创建规范,php,html,xhtml,seo,Php,Html,Xhtml,Seo,我需要PHP代码在标记内生成动态规范URL,如下所示: <link rel="canonical" href="php goes here" /> http://www.mysite.com/script.php?var1=blue&var2=large&pointlessvar=narrow 我希望能够返回一个删除&pointlessvar=窄带的规范URL 并按照我认为合适的方式重新排列变量,如下所示: <link rel="canonical" hre

我需要PHP代码在标记内生成动态规范URL,如下所示:

<link rel="canonical" href="php goes here" />
http://www.mysite.com/script.php?var1=blue&var2=large&pointlessvar=narrow
我希望能够返回一个删除&pointlessvar=窄带的规范URL

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

<link rel="canonical" href="http://www.mysite.com/script.php?var2=large&var1=blue" />
我想这样做是为了SEO的目的,因为我的网站包含许多不同顺序的变量,这些变量为基本相同的内容提供不同的URL,以防止SERP中的重复,并集中链接


有人能推荐一些我可以放在标记中的PHP代码吗?

您可以使用$\u服务器超全局和$\u GET超全局来获取url的各个部分。你可以随意重新排列和过滤它们

您可以使用$\u服务器超全局和$\u GET超全局来获取url的各个部分。你可以随意重新排列和过滤它们

您可以混合使用函数和来重建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\u build\u查询重新生成。

您可以混合使用函数和重新生成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;
}
$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);
然后通过$params循环以取消设置无用的变量,然后使用http_build_查询重新生成

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

php提供了更多的排序功能。
它们甚至允许您自己编写。

要创建一个规范的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();

要创建一个规范的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();


根据什么标准,&pointlessvar=窄视为无用?您应该从使用url重写/seo友好url开始。这样做是值得的,而且可以避免你不得不如此规范。@zerkms也许称之为无点的svar有点误导——我的错。这并不是完全没用——它允许我的访问者缩小搜索结果的范围,但它可能会导致重复的内容,我不希望搜索引擎对这些内容进行索引,因此我需要生成一个规范的URL以将其从SERP中删除。@Boris Guéry——我不想开始重新编写实际的URL,因为我的网站是实时的,并且有数千个URLSERP中的索引页。重新编写URL听起来像是一场重新定向的噩梦:@Matt:我仍然无法获得选择的标准,哪些变量应该出现在规范URL中,哪些不应该。根据什么标准,&pointlessvar=窄视为无用?你应该从使用URL重写/seo友好URL开始。这样做是值得的,而且可以避免你不得不如此规范。@zerkms也许称之为无点的svar有点误导——我的错。这并不是完全没用——它允许我的访问者缩小搜索结果的范围,但它可能会导致重复的内容,我不希望搜索引擎对这些内容进行索引,因此我需要生成一个规范的URL以将其从SERP中删除。@Boris Guéry——我不想开始重新编写实际的URL,因为我的网站是实时的,并且有数千个URLSERP中的索引页。重新编写URL听起来像是一场重新定向的噩梦:@Matt:我仍然无法获得选择的标准,哪些变量应该出现在规范URL中,哪些不应该出现。我不知道PHP_URL_QUERY常量参数, thanks@BorisGuéry是的,直到我看到其他人在这里使用它我才知道它hahaDidn不知道PHP_URL_QUERY常量参数,thanks@Boris盖瑞:是的,直到我在这里看到其他人使用它,我才知道。哈哈,在某些情况下,查询可能会丢失数据。@zerkms,你能指出这方面的任何来源吗?我以前从来没有遇到过问题。哎呀,parse_str及其dot-issuehttp_build_查询在某些情况下可能会丢失数据。@zerkms,你能指出这方面的任何来源吗?我以前从来没有遇到过问题。哎呀,错过了parse_str和它的点问题Hi GolezTrol,这太棒了!谢谢你的帮助-除了两个问题外,它几乎可以满足我的所有需要。1该代码似乎生成了一个与域名重复且缺少http://前缀的URL,例如,它返回以下URL:www.mysite.com/www.mysite.com/script.php?var2=large&var1=blue 2如何在返回的URL中排列变量,使其与我在Function checkP中指定的顺序完全一致
阿拉姆一美元?再次感谢您的时间-我们就快到了!!它不应该这样做,但可能域已经包含在脚本名称中。如果是这样,只需跳过HTTP_主机即可。您需要自己添加“http://”。在$\u服务器中找不到实际的协议前缀。如果你用asort跳过这一行,你的变量将不会被排序。嗨,GolezTrol,谢谢你的回复。添加http://前缀可以完美地解决问题:。我仍然对变量的排序顺序有问题,删除asort没有帮助,变量现在只是以随机顺序出现。我希望它们的顺序与我在Function checkParam$a中指定的顺序完全一致。很抱歉,这太痛苦了!只是为了澄清一下,在删除了asort之后,变量现在将按照它们在实际URL中出现的顺序返回,而不是按照它们在Function checkParam$aI中列出的顺序返回,并进行了另一次修改。添加了比较函数,该函数通过参数数组中的索引比较两个键。我现在使用uasort代替asort,它以与array_filter相同的方式接受回调。它允许您指定自定义比较函数。我还将数组移动到了一个单独的函数中,因此您不必两次声明它。它也可以是一个全局的,尽管你已经到了可以把所有的东西都放在一个特定的类中的地步。但这是另一章嗨,GolezTrol,这太棒了!谢谢你的帮助-除了两个问题外,它几乎可以满足我的所有需要。1代码似乎生成了一个与域名重复且缺少http://前缀的URL,例如,它返回以下URL:www.mysite.com/www.mysite.com/script.php?var2=large&var1=blue 2如何在返回的URL中排列变量,使其与我在Function checkParam$a中指定的顺序完全一致?再次感谢您的时间-我们就快到了!!它不应该这样做,但可能域已经包含在脚本名称中。如果是这样,只需跳过HTTP_主机即可。您需要自己添加“http://”。在$\u服务器中找不到实际的协议前缀。如果你用asort跳过这一行,你的变量将不会被排序。嗨,GolezTrol,谢谢你的回复。添加http://前缀可以完美地解决问题:。我仍然对变量的排序顺序有问题,删除asort没有帮助,变量现在只是以随机顺序出现。我希望它们的顺序与我在Function checkParam$a中指定的顺序完全一致。很抱歉,这太痛苦了!只是为了澄清一下,在删除了asort之后,变量现在将按照它们在实际URL中出现的顺序返回,而不是按照它们在Function checkParam$aI中列出的顺序返回,并进行了另一次修改。添加了比较函数,该函数通过参数数组中的索引比较两个键。我现在使用uasort代替asort,它以与array_filter相同的方式接受回调。它允许您指定自定义比较函数。我还将数组移动到了一个单独的函数中,因此您不必两次声明它。它也可以是一个全局的,尽管你已经到了可以把所有的东西都放在一个特定的类中的地步。但这是另一章