当前位置

Drupal的AMP带翻页页面无法通过结构化数据验证问题的解决

James Qi 在 2019年12月15日 - 23:20 提交

  今年总是接到来自Google Search Console这样的提醒邮件:

在 https://example.com/ 上检测到了 路径 问题
致:https://example.com/ 的所有者
Search Console 发现,您的网站受到了3 个 路径 问题的影响:
出现次数最多的错误
错误可能会导致您的网页或功能无法显示在Google 搜索结果中。我们在您的网站中发现了以下错误:

未填写字段“position”
应指定“name”或“item.name”
字段“itemListElement”的值类型无效

我们建议您尽可能修正这些问题,使您的网站能在Google 搜索中尽可能实现最佳的用户体验和覆盖率。

  而进入Google Search Console后看到:

错误 应指定“name”或“item.name”
错误 字段“itemListElement”的值类型无效
错误 未填写字段“position”

  再点击查看详情,看到:

检测到了 1 项无效内容
无效内容无法在 Google 搜索中显示为富媒体搜索结果。

未填写字段“position”
字段“itemListElement”的值类型无效
应指定“name”或“item.name”
type BreadcrumbList

  我试了一下,例如:https://jamesqi.com/Drupal?page=4&amp= 这样的页面放在Google结构化数据验证工具里面去,就无法通过,但我看源代码找不到原因,把这个页面的源代码复制到验证工具里面却又可以通过验证,真是奇怪了,这种报错一直存在,时常收到邮件提醒,困扰我有几个月时间了。😫

  今天晚上再下功夫来测试,把这个文件保存为一个test.html文件,可以顺利通过结构化数据验证,那说明是网址的问题,我把https://jamesqi.com/Drupal?page=4&amp= 改为https://jamesqi.com/Drupal?amp=&page=4 后也是可以通过验证,再尝试https://jamesqi.com/Drupal?page=4&mip 也可以通过验证,说明是网址中&amp这个的问题,怀疑&符号的转义&写法有关,那就通过下面两个办法来解决:

  一、修改page.tpl.php,对页面中的网址进行替换,使用PHP的正则表达式替换函数:

//2019-12-15 纠正amp页面结构化数据不能通过的问题,将https://jamesqi.com/Drupal?page=5&amp=变换为https://jamesqi.com/Drupal?amp=&page=5
$pattern = "/<a ([^h]*)href=\"([^\?]*)\?(\w+)=([^\"]*)(\?|\&amp;)amp(|=)\"/";
$replace = "<a $1href=\"$2?amp=&$3=$4\"";
$output = preg_replace($pattern,$replace,$output);

  二、修改.htaccess,对以前的网址进行跳转,使用Apache的ReWrite规则:

# 2019-12-15 纠正amp页面结构化数据不能通过的问题,将https://jamesqi.com/Drupal?page=5&amp=跳转到https://jamesqi.com/Drupal?amp=&page=5
RewriteCond     %{QUERY_STRING}         ^(\w+)=(.*)&amp(|=)$
RewriteRule     ^(.*)$                  %{REQUEST_URI}?amp=&%1=%2 [R=301,L]

  使用上面两个办法后,可以解决我这博客网站中的这个问题,后面再来实施到其它有关的系列网站中。这种问题很奇怪,也很少人遇到,在网上也很难搜到类似问题,只有自己断断续续摸索几个月时间,今天晚上又花了好几个小时才终于是找到问题所在和解决办法,不容易啊。✌


  补充:还发现几个以前的问题(url中的&不应该是&amp;)及修改办法,这一点小问题引起的变化还是比较复杂、比较麻烦的。

  WEB版本的html.tpl.php中计算的两个地方(header中amphtml链接和下方显示切换amp版本链接)进行一些修改:

<head>
......
//$url_amp= "$url_web?amp";
$url_amp= "$url_web?amp=";
......
//$url_amphtml= "$url_webhtml&amp;amp";
$url_amphtml = str_replace('?','?amp=&',"https://$server_name$request_uri");
......
</head>
<body>
......
//$amp_url = "$url_web?amp";
$amp_url = "$url_web?amp=";
......
//$amp_url = "https://$server_name$request_uri&amp";
$amp_url = str_replace('?','?amp=&',"https://$server_name$request_uri");
......
//$normal = l('WEB',$normal_url);
//$amp = l('AMP',$amp_url);
//$mip = l('MIP',$mip_url);
$normal = "<a href=\"$normal_url\">WEB</a>";
$amp = "<a href=\"$amp_url\">AMP</a>";
$mip = "<a href=\"$mip_url\">MIP</a>";

  AMP版本的html.tpl.php中计算的两个地方(header中canonical链接和下方显示切换web版本链接)进行一些修改:

//$position = strpos($request_uri,'?amp');
//if ($position == FALSE) $position = strpos($request_uri,'&amp');
//$request_uri_before_amp = substr($request_uri,0,$position);
//$normal_url = "https://$server_name$request_uri_before_amp";
//2019-12-16 上面几行改为下面的$normal_url计算方式
$normal_url = "https://$server_name$request_uri";
$normal_url = str_replace('&amp;amp=','',$normal_url);
$normal_url = str_replace('&amp;amp','',$normal_url);
$normal_url = str_replace('&amp=','',$normal_url);
$normal_url = str_replace('&amp','',$normal_url);
$normal_url = str_replace('?amp=&','?',$normal_url);
$normal_url = str_replace('?amp&','?',$normal_url);
$normal_url = str_replace('?amp=','',$normal_url);
$normal_url = str_replace('?amp','',$normal_url);
......
//$normal = l('WEB',$normal_url);
//$amp = l('AMP ⚡',$amp_url);
$normal = "<a href=\"$normal_url\">WEB</a>";
$amp = "<a href=\"$amp_url\">AMP ⚡</a>";

  MIP版本的html.tpl.php中计算的两个地方(header中canonical链接和下方显示切换web版本链接)进行一些修改:

//$position = strpos($request_uri,'?mip');
//if ($position == FALSE) $position = strpos($request_uri,'&mip');
//$request_uri_before_mip = substr($request_uri,0,$position);
//$normal_url = "https://$server_name$request_uri_before_mip";
//2019-12-16 上面几行改为下面的$normal_url计算方式
$normal_url = "https://$server_name$request_uri";
$normal_url = str_replace('&amp;mip=','',$normal_url);
$normal_url = str_replace('&amp;mip','',$normal_url);
$normal_url = str_replace('&mip=','',$normal_url);
$normal_url = str_replace('&mip','',$normal_url);
$normal_url = str_replace('?mip=&','?',$normal_url);
$normal_url = str_replace('?mip&','?',$normal_url);
$normal_url = str_replace('?mip=','',$normal_url);
$normal_url = str_replace('?mip','',$normal_url);
......
//$normal = l('WEB',$normal_url);
//$mip = l('MIP ⚡',$mip_url);
$normal = "<a href=\"$normal_url\">WEB</a>";
$mip = "<a href=\"$mip_url\">MIP ⚡</a>";

评论

添加新评论

Plain text

  • 不允许使用HTML标签。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。