Googleなどの検索エンジンに効率良くキャッシュされるために、最低限行っておくべきWebサイトの最適化のためのメモ。
目次 |
サイトマップ(sitemap)とは、検索エンジンにキャッシュして欲しいファイルの一覧表のこと。一般的にはsitemaps.org:サイトマップのXML形式に示されているXML形式で作成したもので、sitemap.xmlという名前のファイル。また、Google ウェブマスター ツール サイトマップにも説明が掲載されている。
サイトマップファイルはrobots.txtで指定して検索サイトのクローラに自動発見させる。また、GoogleであればGoogleウェブマスター ツールでファイルを個別指定することも可能。
サイトマップファイルの例 (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
静的サイトでエスケープしなければならないようなURLは存在しないとして、次のステップに進む。
公開したくない不必要なファイルを消去した後に、ファイルのフルパスをURLのフルパスに変更するために、次のようなPerlスクリプトを利用する。(下記の例では、/home/www を http://www.example.com に置き換えてURLフルパスにしている)
#!/usr/bin/perl ## URLリストから、sitemapファイルを作成 use strict; # テキスト形式のsitemapファイル(一時ファイル入力) my $strInFileName = './sitemap.txt'; # XML形式のsitemapファイル(出力) my $strOutFileName = '/home/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 "<!-- sitemap created automatically by script on %04d-%02d-%02d %02d:%02d:%02d (JST). contains %d pages -->\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スクリプトを利用している。
拡張機能mw:Extension:Google 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に、そのサイト内の全てのサイトマップファイルを指定する。
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が置かれたサイトと同一サイト内のみ。(フルパス指定していても、同一サイト内しか認識しないようである)