实现思路
从
$_GET['url']中获取传入的 sitemap 地址参数增加参数合法性校验(非空、URL 格式合规)
保留原有 HTTP 上下文和解析逻辑,适配动态传入的 URL
<?php /** * 动态传入sitemap地址(GET参数),解析并以HTML展示链接 * 使用方式:xxx.php?url=https://tech.sina.cn/sitemap.d.xml */ // 步骤1:从GET参数获取sitemap地址,并做合法性校验 $sitemapUrl = isset($_GET['url']) ? trim($_GET['url']) : ''; // 校验URL是否合法 if (empty($sitemapUrl)) { die(' <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>参数错误</title> <style>body { font-family: Arial; padding: 20px; }</style> </head> <body> <h1 style="color: red;">缺少必要参数</h1> <p>请通过GET方式传入sitemap地址,示例:</p> <code style="background: #f5f5f5; padding: 5px 10px; display: block; margin: 10px 0;"> '.$_SERVER['PHP_SELF'].'?url=https://tech.sina.cn/sitemap.d.xml </code> </body> </html> '); } // 简单校验URL格式(至少以http/https开头) if (!preg_match('/^https?:\/\/.+$/', $sitemapUrl)) { die(' <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>参数错误</title> <style>body { font-family: Arial; padding: 20px; }</style> </head> <body> <h1 style="color: red;">URL格式非法</h1> <p>请传入合法的HTTP/HTTPS协议的sitemap地址,示例:</p> <code style="background: #f5f5f5; padding: 5px 10px; display: block; margin: 10px 0;"> '.$_SERVER['PHP_SELF'].'?url=https://tech.sina.cn/sitemap.d.xml </code> </body> </html> '); } // 设置页面编码 header('Content-Type: text/html; charset=UTF-8'); // 步骤2:检查必要扩展 if (!extension_loaded('SimpleXML')) { die('<h1 style="color: red;">错误:PHP未启用SimpleXML扩展,无法解析XML文件</h1>'); } // 步骤3:配置远程访问的HTTP上下文(解决部分网站访问限制) $context = stream_context_create([ 'http' => [ 'header' => [ 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8', 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8' ], 'timeout' => 30 // 超时时间30秒 ] ]); // 步骤4:读取并解析sitemap.xml try { // 禁用实体加载,防止XXE漏洞 libxml_disable_entity_loader(true); // 读取XML文件(带HTTP上下文) $xmlContent = file_get_contents($sitemapUrl, false, $context); if ($xmlContent === false) { throw new Exception('无法获取远程sitemap.xml文件,请检查URL是否正确或网络是否可达'); } // 解析XML内容 $xml = simplexml_load_string($xmlContent); if ($xml === false) { throw new Exception('解析sitemap.xml失败,文件格式可能不符合标准Sitemap协议'); } // 步骤5:提取链接数据 $links = []; foreach ($xml->url as $url) { // 提取核心信息 $link = [ 'loc' => (string)$url->loc, // 链接地址(必填) 'lastmod' => isset($url->lastmod) ? (string)$url->lastmod : '未设置', // 最后更新时间 'changefreq' => isset($url->changefreq) ? (string)$url->changefreq : '未设置', // 更新频率 'priority' => isset($url->priority) ? (string)$url->priority : '未设置' // 优先级 ]; $links[] = $link; } // 步骤6:生成HTML页面 ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Sitemap 链接列表</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: Arial, "微软雅黑", sans-serif; padding: 20px; background: #f5f5f5; } .container { max-width: 1400px; margin: 0 auto; background: white; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); } h1 { color: #333; margin-bottom: 20px; border-bottom: 2px solid #007cba; padding-bottom: 10px; } .link-item { padding: 15px; border-bottom: 1px solid #eee; } .link-item:last-child { border-bottom: none; } .link-url { font-size: 16px; margin-bottom: 8px; word-break: break-all; } .link-url a { color: #007cba; text-decoration: none; } .link-url a:hover { text-decoration: underline; } .link-meta { font-size: 14px; color: #666; display: flex; gap: 20px; flex-wrap: wrap; } .stats { margin: 20px 0; padding: 10px; background: #f9f9f9; border-radius: 4px; } .empty-tip { color: #999; font-size: 16px; text-align: center; padding: 50px 0; } </style> </head> <body> <div> <h1>Sitemap 链接列表</h1> <div> <strong>数据源:</strong><?php echo htmlspecialchars($sitemapUrl); ?> | <strong>总链接数:</strong><?php echo count($links); ?> | <strong>生成时间:</strong><?php echo date('Y-m-d H:i:s'); ?> </div> <?php if (empty($links)): ?> <p>未从sitemap.xml中解析到任何链接</p> <?php else: ?> <?php foreach ($links as $item): ?> <div> <div> <a href="<?php echo htmlspecialchars($item['loc']); ?>" target="_blank"> <?php echo htmlspecialchars($item['loc']); ?> </a> </div> <div> <span>最后更新:<?php echo htmlspecialchars($item['lastmod']); ?></span> <span>更新频率:<?php echo htmlspecialchars($item['changefreq']); ?></span> <span>优先级:<?php echo htmlspecialchars($item['priority']); ?></span> </div> </div> <?php endforeach; ?> <?php endif; ?> </body> </html> <?php // 异常处理 } catch (Exception $e) { die(' <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>解析失败</title> <style>body { font-family: Arial; padding: 20px; }</style> </head> <body> <h1 style="color: red;">解析sitemap失败</h1> <p>错误信息:'.htmlspecialchars($e->getMessage()).'</p> <p>请检查:</p> <ul> <li>传入的URL是否为有效的sitemap.xml地址</li> <li>服务器网络是否能访问该URL</li> <li>php.ini中 allow_url_fopen = On 是否开启</li> <li>服务器是否有防火墙/代理限制对外访问</li> </ul> </body> </html> '); } ?>补充参数缺失 / 非法时的友好提示
- GET 参数获取与校验(关键):
从
$_GET['url']获取传入的 sitemap 地址,并用trim()去除首尾空格增加非空校验:如果未传
url参数,给出清晰的使用示例提示增加URL 格式校验:通过正则
/^https?:\/\/.+$/确保传入的是 HTTP/HTTPS 协议的合法 URL,防止恶意参数- 通用化样式调整:
将页面主色调改回通用的蓝色(
#007cba),适配任意 sitemap 解析场景保留长链接换行、弹性布局等优化,保证不同 URL 的展示体验
- 使用方式示例:保存代码为
sitemap_parser.php后,访问方式如下:
# 解析新浪科技sitemap sitemap_parser.php?url=https://tech.sina.cn/sitemap.d.xml # 解析其他网站sitemap sitemap_parser.php?url=https://www.example.com/sitemap.xml
- 本文固定链接: http://www.ypbj.cc/post/397.html
- 转载请注明: yupang 于 余胖笔记 发表
《本文》有 0 条评论