2013年8月份寫了一篇博文《Drupal網站多語言版的站點地圖自動轉換》,是修改xmlsitemap.page.inc程序來實現多種語言網站的sitemap,這是多種語言網站提供對應的多種sitemap,博文中提到Google推薦的另外一種辦法《通過站點地圖指明備選語言網頁》(英文版Use a sitemap to indicate alternate language pages, Multilingual and multinational site annotations in Sitemaps ,注意目前需要翻牆訪問),是多種語言網站提供一個sitemap,而這個sitemap中為每個url指定多種語言的替換鍊接。我們此前一直使用的前面一種辦法,但這樣存在搜索引擎不斷爬取很多種語言的sitemap占用帶寬的問題以及沒有在sitemap中指明多語言網址之間的對應關系,昨天換了後面一種辦法來試一試。
具體辦法是修改Drupal的xmlsitemap模塊的xmlsitemap.xmlsitemap.inc這個文件:
public function getRootAttributes() { $attributes['xmlns'] = 'http://www.sitemaps.org/schemas/sitemap/0.9'; $attributes['xmlns:xhtml'] = 'http://www.w3.org/1999/xhtml';//jamesqi 2016-2-19 if (variable_get('xmlsitemap_developer_mode', 0)) {
以及
$xml_content = str_replace(array(" <", ">\n"), array("<", ">"), $xml_content); //jamesqi 2016-2-18 //insert start $line = $xml_content; global $base_url; //print substr($line,0,strlen($base_url)+23)."\n"; if (substr($line,0,strlen($base_url)+23) !== "<loc>$base_url/sitemap.xml?page=") { $loc_start = strpos($line,'<loc>')+5; $loc_end = strpos($line,'</loc>')-1; $loc_url = substr($line, $loc_start, $loc_end-$loc_start+1); $add_url = substr($loc_url, strlen($base_url)); $languages = language_list('enabled'); $languages_array = $languages[1]; $language_default = language_default($property = 'language'); $xhtml_link = ''; foreach ($languages_array as $key => $value) { $lang_code = $key; if ($lang_code != $language_default) { $lang_url = "$base_url/$lang_code$add_url"; } else { $lang_url = "$base_url$add_url"; } $xhtml_link .= "\n\t<xhtml:link rel=\"alternate\" hreflang=\"$lang_code\" href=\"$lang_url\" />"; } $xml_content = str_replace('</loc>',"</loc>$xhtml_link\n",$xml_content); } //insert end $this->writeRaw($xml_content);
這樣生成的sitemapindex例子沒有變化,而urlset例子中按照規範添加了xmlns:xhtml="http://www.w3.org/1999/xhtml"以及各種語言的<xhtml:link rel="alternate" hreflang="af" href="http://sale.mingluji.com/af/node/2628" />,摘錄如下:
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="//sale.mingluji.com/sitemap.xsl"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml"> <url><loc>http://sale.mingluji.com/node/2628</loc> <xhtml:link rel="alternate" hreflang="af" href="http://sale.mingluji.com/af/node/2628" /> <xhtml:link rel="alternate" hreflang="sq" href="http://sale.mingluji.com/sq/node/2628" /> <xhtml:link rel="alternate" hreflang="ar" href="http://sale.mingluji.com/ar/node/2628" /> <xhtml:link rel="alternate" hreflang="hy" href="http://sale.mingluji.com/hy/node/2628" /> <xhtml:link rel="alternate" hreflang="az" href="http://sale.mingluji.com/az/node/2628" /> <xhtml:link rel="alternate" hreflang="bg" href="http://sale.mingluji.com/bg/node/2628" /> <xhtml:link rel="alternate" hreflang="ca" href="http://sale.mingluji.com/ca/node/2628" /> <xhtml:link rel="alternate" hreflang="zh-hans" href="http://sale.mingluji.com/zh-hans/node/2628" /> <xhtml:link rel="alternate" hreflang="zh-hant" href="http://sale.mingluji.com/zh-hant/node/2628" /> <xhtml:link rel="alternate" hreflang="hr" href="http://sale.mingluji.com/hr/node/2628" /> <xhtml:link rel="alternate" hreflang="cs" href="http://sale.mingluji.com/cs/node/2628" /> <xhtml:link rel="alternate" hreflang="da" href="http://sale.mingluji.com/da/node/2628" /> <xhtml:link rel="alternate" hreflang="nl" href="http://sale.mingluji.com/nl/node/2628" /> <xhtml:link rel="alternate" hreflang="en" href="http://sale.mingluji.com/node/2628" /> <xhtml:link rel="alternate" hreflang="eo" href="http://sale.mingluji.com/eo/node/2628" /> <xhtml:link rel="alternate" hreflang="et" href="http://sale.mingluji.com/et/node/2628" /> <xhtml:link rel="alternate" hreflang="fi" href="http://sale.mingluji.com/fi/node/2628" /> <xhtml:link rel="alternate" hreflang="fr" href="http://sale.mingluji.com/fr/node/2628" /> <xhtml:link rel="alternate" hreflang="gl" href="http://sale.mingluji.com/gl/node/2628" /> <xhtml:link rel="alternate" hreflang="ka" href="http://sale.mingluji.com/ka/node/2628" /> <xhtml:link rel="alternate" hreflang="de" href="http://sale.mingluji.com/de/node/2628" /> <xhtml:link rel="alternate" hreflang="el" href="http://sale.mingluji.com/el/node/2628" /> <xhtml:link rel="alternate" hreflang="hu" href="http://sale.mingluji.com/hu/node/2628" /> <xhtml:link rel="alternate" hreflang="is" href="http://sale.mingluji.com/is/node/2628" /> <xhtml:link rel="alternate" hreflang="ga" href="http://sale.mingluji.com/ga/node/2628" /> <xhtml:link rel="alternate" hreflang="it" href="http://sale.mingluji.com/it/node/2628" /> <xhtml:link rel="alternate" hreflang="ja" href="http://sale.mingluji.com/ja/node/2628" /> <xhtml:link rel="alternate" hreflang="ko" href="http://sale.mingluji.com/ko/node/2628" /> <xhtml:link rel="alternate" hreflang="lv" href="http://sale.mingluji.com/lv/node/2628" /> <xhtml:link rel="alternate" hreflang="lt" href="http://sale.mingluji.com/lt/node/2628" /> <xhtml:link rel="alternate" hreflang="mk" href="http://sale.mingluji.com/mk/node/2628" /> <xhtml:link rel="alternate" hreflang="ms" href="http://sale.mingluji.com/ms/node/2628" /> <xhtml:link rel="alternate" hreflang="mt" href="http://sale.mingluji.com/mt/node/2628" /> <xhtml:link rel="alternate" hreflang="fa" href="http://sale.mingluji.com/fa/node/2628" /> <xhtml:link rel="alternate" hreflang="pl" href="http://sale.mingluji.com/pl/node/2628" /> <xhtml:link rel="alternate" hreflang="pt-pt" href="http://sale.mingluji.com/pt-pt/node/2628" /> <xhtml:link rel="alternate" hreflang="ro" href="http://sale.mingluji.com/ro/node/2628" /> <xhtml:link rel="alternate" hreflang="ru" href="http://sale.mingluji.com/ru/node/2628" /> <xhtml:link rel="alternate" hreflang="sr" href="http://sale.mingluji.com/sr/node/2628" /> <xhtml:link rel="alternate" hreflang="sk" href="http://sale.mingluji.com/sk/node/2628" /> <xhtml:link rel="alternate" hreflang="sl" href="http://sale.mingluji.com/sl/node/2628" /> <xhtml:link rel="alternate" hreflang="es" href="http://sale.mingluji.com/es/node/2628" /> <xhtml:link rel="alternate" hreflang="sw" href="http://sale.mingluji.com/sw/node/2628" /> <xhtml:link rel="alternate" hreflang="sv" href="http://sale.mingluji.com/sv/node/2628" /> <xhtml:link rel="alternate" hreflang="th" href="http://sale.mingluji.com/th/node/2628" /> <xhtml:link rel="alternate" hreflang="tr" href="http://sale.mingluji.com/tr/node/2628" /> <xhtml:link rel="alternate" hreflang="uk" href="http://sale.mingluji.com/uk/node/2628" /> <xhtml:link rel="alternate" hreflang="vi" href="http://sale.mingluji.com/vi/node/2628" /> <xhtml:link rel="alternate" hreflang="cy" href="http://sale.mingluji.com/cy/node/2628" /> <lastmod>2016-01-13T03:23Z</lastmod><changefreq>monthly</changefreq></url> ......
注意:
- xmlns:xhtml="http://www.w3.org/1999/xhtml" 這個一定要加,否則Google Webmaster Tools中會有報錯:Unbound XML namespace prefix. The XML Sitemap cannot be parsed because it contains one or more unbound namespace prefixes. For example, this error is generated when <xhtml:link> is found in a Sitemap without prior xmlns:xhtml="http://www.w3.org/1999/xhtml";
- 另外,默認英語的網站也要作為一項xhtml:link加入。
相關配套工作:
- 修改Drupal網站中sitemap設置,把Number of links in each sitemap page改為1000(乘以50種語言就可能讓尺寸達到5萬個頁面的大小,具體修改命令:drush vset xmlsitemap_chunk_size '1000',更多變量:xmlsitemap_prefetch_aliases=1、xmlsitemap_batch_limit=100、xmlsitemap_minimum_lifetime=86400等),以便重新生成的sitemap文件不大于10M(sitemap的規範是不超過5萬頁面和10M文件大小);
- 在頁面中多語言網站之間用rel="alternate" hreflang="x"鍊接起來的辦法以前就實施了,現在也不用變,sitemap和頁面中都指明對應關系;
- 修改robots.txt,去掉以前的每種語言一個sitemap的鍊接,隻保留默認語言的一個;
- 在Google Webmaster Tools中删除以前批量提交的每種語言一個sitemap,隻保留默認語言的一個;
- 修改.htaccess文件,讓以前其它語言的sitemap訪問301重定向到默認的sitemap;
RewriteCond %{REQUEST_URI} ^\/(.+)\/sitemap\.xml(.*)$
RewriteRule ^(.*)$ /sitemap.xml%2 [L,R=301]
這個辦法已經在一個站點嘗試,等觀察一段時間,沒有問題再推廣到更多的站點。
2016年3月22日補充:以上辦法可以實現,但因為保存的sitemap文件每個都是以前的大約50倍,會導緻占用硬盤空間非常大,于是考慮用以前的方式,不修改xmlsitemap.xmlsitemap.inc而是修改xmlsitemap.pages.inc來實現:
while (!feof($fd)) { //jamesqi 2016-3-22//print fread($fd, 1024*16); // modify start $line_input = fgets($fd); if ($line_input == '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'."\n") { $line_output = '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">'."\n"; } elseif (substr($line_input,0,10) == '<url><loc>') { $loc_start = strpos($line_input,'<loc>')+5; $loc_end = strpos($line_input,'</loc>')-1; $loc_url = substr($line_input, $loc_start, $loc_end-$loc_start+1); global $base_url; $add_url = substr($loc_url, strlen($base_url)); $languages = language_list('enabled'); $languages_array = $languages[1]; $language_default = language_default($property = 'language'); $xhtml_link = ''; foreach ($languages_array as $key => $value) { $lang_code = $key; if ($lang_code != $language_default) { $lang_url = "$base_url/$lang_code$add_url"; } else { $lang_url = "$base_url$add_url"; } $xhtml_link .= "\n\t<xhtml:link rel=\"alternate\" hreflang=\"$lang_code\" href=\"$lang_url\" />"; } $line_output = str_replace('</loc>',"</loc>$xhtml_link\n",$line_input); } else { $line_output = $line_input; } print "$line_output"; // modify end } fclose($fd);
這樣生成在硬盤上的.xml文件就與以前總的尺寸差不多,隻是在輸出的時候加上50種語言的網址。
另外,如果要關閉cron期間生成xmlsitemap,可以運行drush vset xmlsitemap_disable_cron_regeneration '1'。
如果在大數據量站點生成網站地圖的時候遇到報錯,可以參考這篇博文《Drupal生成xml sitemap過程中報錯的解決》。
评论