今年總是接到來自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&= 這樣的頁面放在Google結構化數據驗證工具裡面去,就無法通過,但我看源代碼找不到原因,把這個頁面的源代碼複制到驗證工具裡面卻又可以通過驗證,真是奇怪了,這種報錯一直存在,時常收到郵件提醒,困擾我有幾個月時間了。😫
今天晚上再下功夫來測試,把這個文件保存為一個test.html文件,可以順利通過結構化數據驗證,那說明是網址的問題,我把https://jamesqi.com/Drupal?page=4&= 改為https://jamesqi.com/Drupal?amp=&page=4 後也是可以通過驗證,再嘗試https://jamesqi.com/Drupal?page=4&mip 也可以通過驗證,說明是網址中&這個的問題,懷疑&符号的轉義&寫法有關,那就通過下面兩個辦法來解決:
一、修改page.tpl.php,對頁面中的網址進行替換,使用PHP的正則表達式替換函數:
//2019-12-15 糾正amp頁面結構化數據不能通過的問題,将https://jamesqi.com/Drupal?page=5&=變換為https://jamesqi.com/Drupal?amp=&page=5 $pattern = "/<a ([^h]*)href=\"([^\?]*)\?(\w+)=([^\"]*)(\?|\&)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&=跳轉到https://jamesqi.com/Drupal?amp=&page=5 RewriteCond %{QUERY_STRING} ^(\w+)=(.*)&(|=)$ RewriteRule ^(.*)$ %{REQUEST_URI}?amp=&%1=%2 [R=301,L]
使用上面兩個辦法後,可以解決我這博客網站中的這個問題,後面再來實施到其它有關的系列網站中。這種問題很奇怪,也很少人遇到,在網上也很難搜到類似問題,隻有自己斷斷續續摸索幾個月時間,今天晚上又花了好幾個小時才終于是找到問題所在和解決辦法,不容易啊。✌
補充:還發現幾個以前的問題(url中的&不應該是&)及修改辦法,這一點小問題引起的變化還是比較複雜、比較麻煩的。
WEB版本的html.tpl.php中計算的兩個地方(header中amphtml鍊接和下方顯示切換amp版本鍊接)進行一些修改:
<head> ...... //$url_amp= "$url_web?amp"; $url_amp= "$url_web?amp="; ...... //$url_amphtml= "$url_webhtml&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_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,'&'); //$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=','',$normal_url); $normal_url = str_replace('&amp','',$normal_url); $normal_url = str_replace('&=','',$normal_url); $normal_url = str_replace('&','',$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('&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_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>";
评论1
寫得确實專業,,學習了
寫得确實專業,,學習了