(WebServer)Sitemapとrobots.txtの作成 - oasis3855/webpage GitHub Wiki
Googleなどの検索エンジンに効率良くキャッシュされるために、最低限行っておくべきWebサイトのサイトマップファイル作成方法のメモ。
サイトマップ(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>
タグは必須ではないため、必要なければ書かなくてもよい。
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スクリプトを利用している。
拡張機能Google Sitemap(古いバージョンのMediaWikiの場合)や、generateSitemap.phpを用いると簡単にサイトマップファイルを作成できる。
記事追加時に自動的にサイトマップファイルを作成させるために、次のようなインデックス・テンプレートを新規作成する。 テンプレート名:サイトマップ自動作成 ← この名前は任意 出力ファイル名: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に、そのサイト内の全てのサイトマップファイルを指定する。
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が置かれたサイトと同一サイト内のみ。(フルパス指定していても、同一サイト内しか認識しないようである)