<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
<meta charset="UTF-8">
<title>XML网站地图生成PHP程序</title>
<meta name="robots" content="NOINDEX,NOFOLLOW">
<!-- 加载 Free Icon Fonts - 如果不使用,可以删除 -->
<link href="https://use.fontawesome.com/releases/v6.2.0/css/all.css" rel="stylesheet">
</head>
<body>
<h2> <i class="fa-regular fa-pen-to-square fa-2x" style="color: crimson"></i> XML网站地图的创建</h2>
<hr>
<div style="margin:15px 5px 10px 20px;padding: 0 15px 0 0; font-size: 14px;background-color: lavenderblush; border: gray 1px solid; border-radius: 4px;">
<div style="margin:15px 0 0 20px">
<form method="post">
<input type="submit" name="downloadLocal" value="下载XML文件到本地" style="background-color: white;border-radius: 5px;cursor: pointer;">
</form>
</div>
<ul>
<li>从这里下载的XML文件包含页面的HTML部分。</li>
<li>请作为参考查看,如果需要纯粹的XML文件,请从远程服务器下载。或者,删除已下载文件的HTML部分。XML文件从 "<?xml version="1.0" encoding="UTF-8"?>" 到 "</urlset>"。</li>
</ul>
</div>
<hr>
<?php
//************************************************
// XML网站地图生成PHP程序
// XML Sitemap Generation PHP Program
// 程序提供:大家的知识 便利小册子
// Everyone's Knowledge A Little Useful Book
// Minna no Chishiki Chotto Benricho
// みんなの知識 ちょっと便利帳
// https://www.benricho.org/Tips/sitemapgenerator/
/// 发布日期:2024年1月3日
//************************************************
// Web服务器的文档根目录。自动获取
$sitemapDirectory = $_SERVER['DOCUMENT_ROOT'];
// .xml文件的名称(最终文件名)
// .xml文件的名称可以更改。但是,许多搜索引擎将“sitemap.xml”作为标准命名规则,并建议使用“sitemap.xml”
$finalSitemapFilename = 'sitemap.xml';
// 网站地图文件的保存路径(最终目录 - 根目录)
$finalSitemapPath = $sitemapDirectory . '/' . $finalSitemapFilename;
// 生成网站地图的目标目录
$rootDirectory = $_SERVER['DOCUMENT_ROOT'];
// .xml文件的名称(临时文件名)
$tempSitemapFilename = 'temporarysitemap.xml';
// 网站地图文件的保存路径(临时目录)
$tempSitemapPath = $sitemapDirectory . '/' . $tempSitemapFilename;
// 如果临时目录不存在,则创建
$tempDirectory = dirname($tempSitemapPath);
if (!file_exists($tempDirectory)) {
mkdir($tempDirectory, 0777, true);
}
// 删除旧网站地图,将其重命名为新网站地图(使用shell命令)
$oldSitemapFilename = 'old-' . $finalSitemapFilename;
$oldSitemapPath = $sitemapDirectory . '/' . $oldSitemapFilename;
// 如果旧网站地图存在,则删除
if (file_exists($oldSitemapPath)) {
unlink($oldSitemapPath);
}
// 重命名为新网站地图
if (file_exists($tempSitemapPath)) {
rename($tempSitemapPath, $oldSitemapPath);
}
// 检查下载按钮是否被点击
if (isset($_POST['downloadLocal'])) {
// 将网站地图复制到临时目录
copy($finalSitemapPath, $tempSitemapPath);
// 设置下载的标头
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $finalSitemapFilename . '"');
header('Content-Length: ' . filesize($tempSitemapPath));
// 输出文件
readfile($tempSitemapPath);
// 下载后,删除保存在临时目录中的网站地图
unlink($tempSitemapPath);
exit;
}
///// 排除设置 /////
// 要排除的目录。只指定要排除的目录名。['dir-1', 'dir2'] 等
// 如果不需要,请留空。[];
$excludeDirectories = [];
// 要排除的文件。只指定文件名。['aaa.html', 'bbb.php'] 等
// 如果不需要,请留空。[];
$excludeFiles = [];
// 要排除的目录/文件 ['dir-1/dir1/file1.html', 'dir2/file2.php'] 等
// 不要在开头添加“/”
// 如果不需要,请留空。[];
$excludePaths = [];
// 排除包含 ['NOINDEX', 'NOFOLLOW', 'REFRESH'] 在内的元标签的文件
// 如果不需要,请留空。[];
// 推荐指定 ['NOINDEX']
$excludeMetaTags = ['NOINDEX'];
///// 网站地图生成条件 /////
// 获取页面标题(1:获取,2:不获取)
// ※在Google Search Console中不建议使用
// ※[重要]如果要注册到Google Search Console,则将其设置为“2:不获取”
// ※如果将其设置为“1:获取”,则Google Search Console将显示“无法识别标题标记。请进行修正”的警报
$getTitle = 2;
// 从页面标题中删除的字符串
// ※您可以指定要从标题中删除的字符串。例如,['的','是'] 等。这意味着您可以删除标题中的类似于'今天的问题'中的'的'和'是'等词汇。
// 如果不需要,请留空。[];
$removeTitleStrings = [];
// 获取文件的最后修改日期(1:获取,2:不获取)
// ※ 在Google Search Console中推荐
$getLastMod = 1;
// 页面更新频率
// ※ 在Google中忽略・不推荐。被认为是“请勿添加值”
// 使用页面更新频率(1:使用,2:不使用)
$useChangeFreq = 2;
// 选择更新频率的元素
// 如果选择“1”,则选择页面更新频率的元素。['always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', 'never']
// 元素 always:每次访问都更新,hourly:每小时更新,daily:每天更新,weekly:每周更新,monthly:每月更新,yearly:每年更新,never:不更新
$changefreqValues = ['适用于您自己的网站的元素'];
// 页面优先级
// ※ 在Google中忽略・不推荐。被认为是“请勿添加值”
// 获取 priority(1:获取,2:不获取)
$getPriority = 2;
// 网站地图生成消息
$successMessage = "<p>・ 网站地图XML文件已生成。<br>・ Sitemap XML file has been generated.</p><p>・以\"{$finalSitemapFilename}\"的形式保存在远程服务器的根目录下。<br>・出于安全考虑,请删除远程服务器上的程序文件。</p>";
// 网站地图XML头部(最终文件用)
$xmlFinal = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
XML;
// 递归处理目录内的文件(最终文件用)
function generateSitemap($directory, $excludeDirs, $excludeFiles, $getTitle, $removeTitleStrings, $getLastMod, $excludeMetaTags, $useChangeFreq, $changefreqValues, $getPriority, $excludePaths, &$xmlFinal) {
$dir = new DirectoryIterator($directory);
foreach ($dir as $fileInfo) {
if ($fileInfo->isDot()) continue;
$filename = $fileInfo->getFilename();
$filepath = $fileInfo->getPathname();
$fileExtension = pathinfo($filename, PATHINFO_EXTENSION);
// 检查是否为要排除的目录/文件
$excludePath = str_replace($_SERVER['DOCUMENT_ROOT'], '', $filepath);
if (in_array(ltrim($excludePath, '/'), $excludePaths)) {
continue;
}
if ($fileInfo->isDir()) {
if (in_array($filename, $excludeDirs)) {
continue;
} else {
generateSitemap($filepath, $excludeDirs, $excludeFiles, $getTitle, $removeTitleStrings, $getLastMod, $excludeMetaTags, $useChangeFreq, $changefreqValues, $getPriority, $excludePaths, $xmlFinal);
}
} else {
if (in_array($filename, $excludeFiles) || in_array($filename, $excludeDirs)) {
continue;
}
if (in_array($fileExtension, ['html', 'php'])) {
processFile($filepath, $getTitle, $removeTitleStrings, $getLastMod, $excludeMetaTags, $useChangeFreq, $changefreqValues, $getPriority, $xmlFinal);
}
}
}
}
// 处理文件(最终文件用)
function processFile($filepath, $getTitle, $removeTitleStrings, $getLastMod, $excludeMetaTags, $useChangeFreq, $changefreqValues, $getPriority, &$xmlFinal) {
$content = file_get_contents($filepath);
if (shouldExcludeContent($content, $excludeMetaTags)) {
return;
}
$url = getRelativeUrl($filepath);
// UTC(协调世界时)设置 - 在网站地图XML的<lastmod>元素中,通常建议使用UTC(协调世界时)
$lastMod = ($getLastMod == 1) ? getLastModifiedDateUTC($filepath) : '';
$xmlFinal .= "\n <url>";
$xmlFinal .= "\n <loc>{$url}</loc>";
if ($getTitle == 1) {
$title = getTitleFromContent($content);
if (!empty($title)) {
$title = str_replace($removeTitleStrings, '', $title);
$xmlFinal .= "\n <title>{$title}</title>";
}
}
// 显示最后更新日期
if (!empty($lastMod)) {
$xmlFinal .= "\n <lastmod>{$lastMod}</lastmod>";
}
// 显示 changefreq
if ($useChangeFreq == 1) {
$changefreq = $changefreqValues[array_rand($changefreqValues)];
$xmlFinal .= "\n <changefreq>{$changefreq}</changefreq>";
}
// 显示 priority
if ($getPriority == 1) {
$priority = getPriorityFromDepth($filepath);
$xmlFinal .= "\n <priority>{$priority}</priority>";
}
$xmlFinal .= "\n </url>";
}
// 根据深度获取 priority(最终文件用)
function getPriorityFromDepth($filepath) {
$depth = substr_count($filepath, DIRECTORY_SEPARATOR);
return 1 - ($depth * 0.1);
}
// 确定是否应该排除内容(最终文件用)
function shouldExcludeContent($content, $excludeMetaTags) {
foreach ($excludeMetaTags as $tag) {
if (stripos($content, '<meta name="robots" content="' . $tag) !== false) {
return true;
}
}
return false;
}
///// 获取文件的最后修改日期 - 在网站地图XML的<lastmod>元素中,通常建议使用UTC(协调世界时)
// UTC(协调世界时)设置。(显示“+00:00”和UTC(协调世界时)的标志)
function getLastModifiedDateUTC($filepath) {
$lastModTimestamp = filemtime($filepath);
$lastModDateTime = new DateTimeImmutable('@' . $lastModTimestamp);
return $lastModDateTime->format('c');
}
// HTML文件中获取标题(最终文件用)
function getTitleFromContent($content) {
$dom = new DOMDocument;
libxml_use_internal_errors(true); // 隐藏错误
$dom->loadHTML($content);
$titleElements = $dom->getElementsByTagName('title');
if ($titleElements->length > 0) {
$title = $titleElements->item(0)->textContent;
return $title;
}
return '';
}
// 获取文件的URL(最终文件用)
function getRelativeUrl($filepath) {
$relativeUrl = str_replace($_SERVER['DOCUMENT_ROOT'], '', $filepath);
return $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['SERVER_NAME'] . str_replace('\\', '/', $relativeUrl);
}
// 开始生成网站地图(最终文件用)
generateSitemap($rootDirectory, $excludeDirectories, $excludeFiles, $getTitle, $removeTitleStrings, $getLastMod, $excludeMetaTags, $useChangeFreq, $changefreqValues, $getPriority, $excludePaths, $xmlFinal);
// 网站地图底部(最终文件用)
$xmlFinal .= "\n</urlset>";
// 将网站地图保存到文件(最终文件用)
file_put_contents($finalSitemapPath, $xmlFinal);
// 显示成功消息(已生成最终文件)
echo $successMessage;
?>
<hr>
<p style="margin-top: 20px">
<!-- 将文件名设置为此PHP程序的<a>标签。扩展名为“.php” -->
<a href="此程序的文件名.php" style="margin-left: 20px; text-decoration: none;"><i class="fa-solid fa-check" style="color: #005eff;"></i> 重新生成“XML文件” <i class="fa-solid fa-rotate fa-spin fa-2x" style="color:crimson"></i>[重新加载页面]</a>
</p>
<p>
<!-- 在浏览器中打开生成的“XML文件” -->
<a href='<?php echo '/' . $finalSitemapFilename; ?>' target='_blank' style='margin-left: 20px; text-decoration: none;'><i class="fa-solid fa-check" style="color: #005eff;"></i> 在浏览器中打开“XML文件” <i class="fa-solid fa-chalkboard-user fa-beat-fade fa-2x" style="color:green"></i>[新选项卡]</a>
<div style="margin-left: 30px;font-size: 12px;color: gray">※如果文件大小较大,可能无法在浏览器中打开。如果无法在浏览器中打开,请从Web服务器下载“.xml”文件以进行确认。</div>
</p>
<!-- “Google”站点地图的添加和更新确认 -->
<hr>
<p>
<!-- 将自己的URL设置为<a>标签 -->
<a href="https://search.google.com/search-console/sitemaps?resource_id=您的URL" target="_blank" style="margin-left: 20px; text-decoration: none;"> <i class="fa-solid fa-check" style="color: #005eff;"></i>确认“<strong>Google</strong>”站点地图的添加和更新 <i class="fa-solid fa-arrow-up-from-bracket fa-bounce fa-2x" style="color: #db0016;"></i></a>
</p>
<!-- “Google Search Console” -->
<p>
<!-- 将自己在Google Search Console中注册的“站点地图”页面的URL设置为<a>标签 -->
<a href="https://search.google.com/search-console?resource_id=您的URL" target="_blank" style="margin-left: 20px; text-decoration: none;"><i class="fa-solid fa-check" style="color: #005eff;"></i>“<strong>Google Search Console</strong>” <i class="fa-solid fa-up-right-from-square fa-beat fa-2x" style="color: blue"></i></a>
<div style="font-size: 13px; margin: 0 40px">※假设您已经注册了“Google Search Console”。</div>
</p>
<!-- “Bing”站点地图的重新提交和更新确认 -->
<p>
<!-- 将自己在Bing的“Webmaster Tools”页面的URL和设置的XML文件名设置为<a>标签。文件名应与“$sitemapFilename”中设置的文件名相匹配 -->
<a href="https://www.bing.com/webmasters/sitemaps?siteUrl=您的URL/sitemap.xml" target="_blank" style="margin-left: 20px; text-decoration: none;"> <i class="fa-solid fa-check" style="color: #005eff;"></i>确认“<strong>Bing</strong>”站点地图的重新提交和更新 <i class="fa-solid fa-arrow-up-from-bracket fa-bounce fa-2x" style="color: #db0016;"></i></a>
</p>
<!-- “Bing webmaster Tools” -->
<p>
<!-- 将自己在Bing的“Webmaster Tools”页面的URL设置为<a>标签 -->
<a href="https://www.bing.com/webmasters/home?siteUrl=您的URL" target="_blank" style="margin-left: 20px; text-decoration: none;">
<i class="fa-solid fa-check" style="color: #005eff;"></i>“<strong>Bing Webmaster Tools</strong>” <i class="fa-solid fa-up-right-from-square fa-beat fa-2x" style="color: blue"></i></a>
<div style="font-size: 13px; margin: 0 40px">※假设您已经完成了“Bing Webmaster Tools”的注册或与“Google Search Console”的联合。</div>
</p>
<hr>
<!-- 您网站的名称等。如果不需要,请删除 -->
<h3 align="center"><i class="fa-solid fa-house" style="color: crimson"></i> 您网站的名称 <i class="fa-solid fa-house" style="color: crimson"></i></h3>
<!-- 可以删除 -->
<h4 align="center"><a href="https://www.benricho.org/" target="_blank" style="text-decoration: none;"><i class="fa-solid fa-house" style="color: blue"></i> 大家的知识 小小的便笺 - みんなの知識 ちょっと便利帳 <i class="fa-solid fa-house" style="color: blue"></i></h4>
</body>
</html>