您在這裡

多語言網站xml sitemap中網址的相互鍊接

James Qi 在 2016年2月19日 - 10:10 發表

  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>

......

  注意:

  1. 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"
  2. 另外,默認英語的網站也要作為一項xhtml:link加入。

  相關配套工作:

  1. 修改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文件大小);
  2. 在頁面中多語言網站之間用rel="alternate" hreflang="x"鍊接起來的辦法以前就實施了,現在也不用變,sitemap和頁面中都指明對應關系;
  3. 修改robots.txt,去掉以前的每種語言一個sitemap的鍊接,隻保留默認語言的一個;
  4. 在Google Webmaster Tools中删除以前批量提交的每種語言一個sitemap,隻保留默認語言的一個;
  5. 修改.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過程中報錯的解決》。

 

發表新回應

Plain text

  • 不允許使用 HTML 標籤。
  • 自動將網址與電子郵件地址轉變為連結。
  • 自動斷行和分段。