(WebServer)Sitemapとrobots.txtの作成 - oasis3855/webpage GitHub Wiki

Googleなどの検索エンジンに効率良くキャッシュされるために、最低限行っておくべきWebサイトのサイトマップファイル作成方法のメモ。

Table of Contents

サイトマップ

サイトマップsitemap)とは、検索エンジンにキャッシュして欲しいファイルの一覧表のこと。一般的にはsitemaps.org:サイトマップのXML形式に示されているXML形式で作成したもので、sitemap.xmlという名前のファイル。また、Google検索セントラル「クロールとインデックス登録」のサイトマップの作成と送信にも説明が掲載されている。

サイトマップファイルはrobots.txtで指定して検索サイトのクローラに読み込み指定する。また、Google Search Consoleに登録済みであれば直接サイトマップファイルを個別指定することも可能。

サイトマップファイルの例 (UTF-8エンコードで保存する

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
   <url>
      <loc>http://oasis.halfmoon.jp/mw/index.php?title=%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8</loc>
      <lastmod>2009-02-20</lastmod>
      <changefreq>monthly</changefreq>
      <priority>0.5</priority>
   </url>
   <url>
      <loc>http://oasis.halfmoon.jp/mw/index.php?title=(MediaWiki)_previouspage_restrict%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD</loc>
   </url>
</urlset> 

<lastmod>,<changefreq>,<priority>タグは必須ではないため、必要なければ書かなくてもよい。

静的サイトのsitemap一括作成方法

UNIXまたはLinuxサーバにログオンして、次のようなコマンドとスクリプトを利用することで効率よくサイトマップファイルを作成できる。(何百もあるファイルを、一つずつ登録するような馬鹿な真似は出来ない…)

まず、web公開フォルダ以下の全ての*.htm,*htmlファイルの一覧をsitemap.txtに出力する。

 find ~/www/* -name "*.htm*" -print > sitemap.txt

複数のパターンで検索する場合は次のようにする

 find ~/www/* \( -name "*.html" -or -name "*.shtml" \) -print > sitemap.txt

特定のディレクトリを除外したい場合は

 find ~/www/* -not \( -path '~/www/cgi-bin/*' -or -path '~/www/data*' \) \( -name "*.html" -or -name "*.shtml" \) -print > sitemap.txt

静的サイトでエスケープしなければならないようなURLは存在しないとして、次のステップに進む。

公開したくない不必要なファイルを消去した後に、ファイルのフルパスをURLのフルパスに変更するために、次のようなPerlスクリプトを利用する。(下記の例では、/home/www を http://www.example.com に置き換えてURLフルパスにしている)

#!/usr/bin/perl
# URLリストから、sitemapファイルを作成
use strict;
use warnings;

# テキスト形式のsitemapファイル(対象htmlファイルのフルパスを列挙したテキストファイル)
my $strInFileName = './sitemap.txt';
# XML形式のsitemapファイル(出力)
my $strOutFileName = '/home/user/www/sitemap.xml';
# ファイルから一時的にデータを読み込む配列
my @aryData = [];
# ファイルの属性をstat関数で読み込むための配列
my @filestat = [];

my $strTmp;
my $strTimestamp;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

# ファイルハンドル
my $hFile;

if(!open($hFile, $strInFileName))
{
    # 入力ファイルが開けない場合
    print "src file (sitemap.txt) open error\n";
    exit;
}
@aryData = <$hFile>;
close($hFile);

if(!open($hFile, ">".$strOutFileName))
{
    # 出力ファイルが開けない場合
    print "src file (sitemap.xml) open error\n";
    exit;
}

print $hFile "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
printf $hFile "\n", $year+1900, $mon+1, $mday, $hour, $min, $sec, $#aryData;
print $hFile "<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";

foreach $strTmp (@aryData) {
    # 行末の改行を除去
    $strTmp =~ s/\n//g;
    # ファイルの更新時刻を得る
    @filestat = stat $strTmp;
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($filestat[9]);
    # ファイル名をURLに変換
    $strTmp =~ s/\/home\/www/http:\/\/www.example.com/g;
    print $hFile "  <url>\n";
    print $hFile "    <loc>".$strTmp."</loc>\n";
    printf $hFile "    <lastmod>%04d-%02d-%02dT%02d:%02d:%02d+09:00</lastmod>\n", $year+1900, $mon+1, $mday, $hour, $min, $sec;
    print $hFile "    <changefreq>daily</changefreq>\n";
    print $hFile "  </url>\n";
}

print $hFile "</urlset>\n";

close($hFile);

exit(0);

sedコマンドを使わないのは、環境によりsedパラメータでタブや改行のエスケープ文字(\tとか\n)が扱えないため、Perlスクリプトを利用している。

MediaWikiでのsitemap一括作成方法

拡張機能Google Sitemap(古いバージョンのMediaWikiの場合)や、generateSitemap.phpを用いると簡単にサイトマップファイルを作成できる。

Movabletypeでのsitemap一括作成方法

記事追加時に自動的にサイトマップファイルを作成させるために、次のようなインデックス・テンプレートを新規作成する。 テンプレート名:サイトマップ自動作成   ← この名前は任意 出力ファイル名:sitemap.xml  ← robots.txtなどに指定するためのファイル名 「インデックス・テンプレートを再構築するときに、自動的に再構築」をONにする。

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc><$MTBlogURL encode_xml="1"$></loc>
        <priority>1.0</priority>
    </url>
<MTEntries lastn="9999">
    <url>
        <loc><$MTEntryPermalink encode_xml="1"$></loc>
        <lastmod><$MTEntryModifiedDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$></lastmod>
    </url>
</mtentries>
</urlset>

Google Sitemaps using Movable Typeからプログラムをコピーした。

robots.txt

サイトのルートディレクトリに置いたrobots.txtに、そのサイト内の全てのサイトマップファイルを指定する。

User-Agent: *
Disallow: /cgi-bin/
Allow: /
Sitemap: http://example.com/sitemap.xml
Sitemap: http://example.com/sitemap_wiki.xml
Sitemap: http://example.com/myblog/sitemap.xml

ここで指定できるサイトマップファイルは、robots.txtが置かれたサイトと同一サイト内のみ。(フルパス指定していても、同一サイト内しか認識しないようである)

⚠️ **GitHub.com Fallback** ⚠️