はじめに
デフォルトでは、next-sitemapはpublic/
ディレクトリに直接サイトマップファイルを生成します。これは、標準のサイトマップの保存場所がhttps://<ウェブサイトの名前>/sitemap.xml
の形式であることを意味します。
サイトマップのプライバシー
サイトマップはウェブスクレイパーにとって宝の地図のような役割を果たし、ウェブサイト内のリンクの包括的なリストを提供します。ウェブスクレイパーがサイトマップを特定すると、サイトのほとんど全てのページにアクセスできます。
サイトマップの場所は、理想的にはGoogleなどの検索エンジンのみが知っているべきです。Googleがサイトマップを認識すると、Yahoo! JapanやBingなどの他の検索エンジンでもウェブサイトのSEOが向上します。スクレイパーにはサイトマップの場所を公開する必要はありません。デフォルトの場所である/sitemap.xml
のままにしておくと、ウェブスクレイパーによる無限のクローリングを招くことになります。このため、スクレイパーに簡単にアクセスされることを防ぐために、デフォルトのサイトマップの保存場所を変更することが重要です。
サイトマップディレクトリの変更
next-sitemapライブラリを使用すると、サイトマップの保存場所を変更することができます。これは、next-sitemap.config.js
ファイルでoutDir
を指定することで実現できます。この機能により、ユーザーは好きな場所にサイトマップを保存する柔軟性を持つことができます。
具体的には、next-sitemap.config.js
ファイルでoutDir
を次のように指定します。これによりsitemap.xml
とrobots.txt
の出力がpublic/my-dir
に向けられます。
/** @type {import('next-sitemap').IConfig} */
module.exports = {
siteUrl: 'https://io.traffine.com/',
generateRobotsTxt: true,
sitemapSize: 7000,
+ outDir: './public/my-dir'
};
robots.txtとsitemap.xmlの誤ったディレクション
ユーザーが直面する問題に、robots.txt
とsitemap.xml
がoutDir
で指定されたディレクトリを正しく指していないことがあります。生成されたエントリを見てみます。
# *
User-agent: *
Allow: /
# Host
Host: https://hoge.jp
# Sitemaps
Sitemap: https://io.traffine.com/sitemap.xml # here is the problem
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap><loc>https://io.traffine.com/sitemap-0.xml</loc></sitemap> <!-- Here is the problem -->
</sitemapindex>
これらのファイルが/public
に生成されたかのように、誤ったパスを指していることがわかります。
これらのファイルは、次のようになるべきです。
# *
User-agent: *
Allow: /
# Host
Host: https://hoge.jp
# Sitemaps
- Sitemap: https://io.traffine.com/sitemap.xml # Here is the problem
+ Sitemap: https://io.traffine.com/my-dir/sitemap.xml
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
- <sitemap><loc>https://io.traffine.com/sitemap-0.xml</loc></sitemap> <!-- Here is the problem -->
+ <sitemap><loc>https://io.traffine.com/my-dir/sitemap-0.xml</loc></sitemap>
</sitemapindex>
問題への解決方法
robots.txt
とsitemap.xml
のディレクションの問題を修正するために、JavaScriptファイルを作成して使用する解決方法を実装できます。
まず、sitemap-replace.js
という名前のJavaScriptファイルを準備します。このスクリプトは既存のrobots.txt
とsitemap.xml
ファイルを読み込み、誤ったパスを正しいパスに置換し、修正されたデータをファイルに書き込みます。以下に手順を示します。
const replaceSitemap = async (fileName) => {
const fs = require('fs/promises')
const appRoot = require('app-root-path')
const subDirectory = 'my-dir' // Change this
const filePath = `${appRoot}/public/${subDirectory}/${fileName}`
const original = await fs.readFile(filePath, 'utf8')
const replacedData = original.replace(
/https\:\/\/io\.traffine\.com\/sitemap/g, // Change this
`https://io.traffine.com/${subDirectory}/sitemap` // Change this
)
await fs.writeFile(filePath, replacedData, 'utf8')
}
;(async () => {
await replaceSitemap('robots.txt')
await replaceSitemap('sitemap.xml')
})()
次に、package.json
のpostbuild
コマンドを調整して、next-sitemap
コマンドの後にこのスクリプトが実行されるようにします。これにより、プロジェクトをビルドするたびにスクリプトが実行され、サイトマップのパスが指定したディレクトリに正しく向けられるようになります。
{
...
"build": "next build",
- "postbuild": "next-sitemap --config next-sitemap.config.js"
+ "postbuild": "next-sitemap --config next-sitemap.config.js && node sitemap-replace.js"
...
}
このスクリプトを実行すると、robots.txt
とsitemap.xml
ファイルの内容が正しく更新され、新しいディレクトリを指すようになります。更新されたファイルは次のようになります。
# *
User-agent: *
Allow: /
# Host
Host: https://io.traffine.com
# Sitemaps
Sitemap: https://io.traffine.com/my-dir/sitemap.xml
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap><loc>https://io.traffine.om/my-dir/sitemap-0.xml</loc></sitemap>
</sitemapindex>
この解決方法により、サイトマップの場所のプライバシーが保持されつつ、検索エンジンが正しくアクセスできるようになります。
参考