惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
博客园 - 【当耐特】
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志
WordPress大学
WordPress大学
D
Docker
T
The Blog of Author Tim Ferriss
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Azure Blog
Microsoft Azure Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
M
MIT News - Artificial intelligence
H
Hackread – Cybersecurity News, Data Breaches, AI and More
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
云风的 BLOG
云风的 BLOG
F
Fortinet All Blogs
罗磊的独立博客
小众软件
小众软件
A
About on SuperTechFans
MyScale Blog
MyScale Blog
D
DataBreaches.Net
The GitHub Blog
The GitHub Blog
C
Check Point Blog
L
LangChain Blog

洛丽糖

西行乱斗(送一个本体兑换码,先到先得) Tabbit浏览器多功能AI助手 关于博主年纪轻轻就得了哪些病。 使用AI写的一款“魔法花园”程序源码 猜猜这是什么?夏天的味道。 "微博客"的重生与否之相关历程 小小甲虫拿捏 月季从盛放至凋零 “微博客”程序正式停止维护更新了 救命!这串李子看得我口水狂飙! 山野桃林闲游 枝头青桃,满是初夏的清甜念想 从别人家路过拍的,不知道叫什么? 一颗桃子的一生:从青涩到“爆甜”的旅程 田地变虾塘,农村人的前路该往哪走 p:last-child 与 p:last-of-type 的核心区别(AI教程版) 雪豹速清app 很久之前拍的:青黄小樱桃,酸甜正撩人 “XmBooks”主题更新日志动态 网站 SSL 证书过期,火速续上免费三月证书 Typecho走心评论精选功能实现代码教程 本站也实现了走心评论精选功能 老家插秧季,一田新绿入夏来 稻田里撞见,一场新生的蜕变
使用AI完成的一款网址导航程序
寻梦xunm · 2026-09-13 · via 洛丽糖

注意:这是一款通过AI完成的网址导航程序,不是作者自己动手编写开发的,作者也只是提供开发思路。

网址导航系统(xmurl)

一个基于原生 PHP 开发的轻量级网址导航站。
零第三方依赖 —— 不引入任何 Composer 包、不用任何第三方 CSS/JS 框架,全部代码自行实现;同时支持 MySQL / SQLite 双数据库驱动,下载即用。

前台提供分类导航、多引擎搜索、热门排行、站点详情与搜索引擎权重查询;后台提供分类 / 网址 / 公告 / 系统设置的完整管理,以及投稿审核、数据导入导出、模板切换等运营能力。

  • 当前版本:1.0.6bootstrap.php 中的 XM_VERSION
  • 运行环境:PHP 7.4+(推荐 8.x)、MySQL 5.7+ / SQLite 3
  • 授权:私有项目

一、核心特性

模块能力
导航展示分类聚合、图标展示、站点描述、点击量统计、热门 TOP 排行、最新收录、推荐位
搜索聚合站内搜索 + 百度 / 搜狗 / 必应 / 360 / 神马 / 头条 / 谷歌 七引擎一键切换
站点详情站点信息、网站截图、相关推荐、搜索引擎权重与收录量查询(百度 / 360 / 搜狗 / 神马 / 必应 / 头条 / 谷歌)
信息自动抓取输入网址一键抓取标题 / 描述 / favicon / Logo(含 SSRF 白名单防护、512KB 体积上限、字符集自动转码)
图标三来源自动抓取、手动填 URL、本地上传,三者共用同一套选择器组件
前台投稿访客自助提交网址,蜜罐反机器人 + 回链自动检测 + 待审核队列
权重接口适配任意第三方权重 API 可通过「接口地址 + 字段映射」接入,无需改代码;内置 apihz / chinaz / nxvav 三套一键预设
数据管理CSV / JSON 导入导出(含字段映射与导入报告)
模板系统前台 / 后台皮肤可切换,视图解析走 Skin::resolve()
多用户与安全管理员会话、CSRF 令牌、IP 维度服务端限流、参数化 SQL、全站输出转义

二、技术栈与设计约束

说明
语言PHP(declare(strict_types=1),要求 7.4+)
架构原生 MVC 简化实现,无框架
命名空间xm\core\*(基础层)、xm\app\model\*(模型层)
自动加载bootstrap.php 内注册的 PSR-4 简化自动加载器(含目录穿越防护)
数据库PDO 封装(xm\core\Db),支持 MySQL / SQLite,表前缀可配
前端原生 HTML / CSS / JavaScript,无任何框架;脚本按页面拆分为独立文件
依赖零 Composer 包、零第三方 CDN 资源,可完全离线部署

项目约定:

  • 代码标识符(类 / 方法 / 变量 / 数组键)统一使用英文并遵循 PSR-12;注释、异常消息使用中文。
  • 视图模板位于 views/**,由 Skin::resolve() 按区域(frontend / admin)解析。
  • 前端资源通过 ?v=XM_VERSION 破缓存,修改 assets/ 下任意 css/js 后必须手动递增 XM_VERSION
  • 所有 <img> 必须声明 loading="lazy" decoding="async";图片容器需有固定尺寸或 aspect-ratio,避免布局跳动。

三、目录结构

t.cc/
├── index.php            前台首页 / 公告列表 / 分类页(按 p / c / s / e / page 参数分流)
├── submit.php           前台投稿表单
├── detail.php           站点详情页(含权重查询面板)
├── go.php               出站跳转(点击计数 + 白名单校验)
├── fetchmeta.php        公开接口:抓取目标站标题/描述/图标
├── upload.php           公开接口:图标上传
├── weight.php           公开接口:搜索引擎权重查询
├── install.php          安装向导(首次部署用)
├── bootstrap.php        引导文件:常量、自动加载、配置、会话、数据库初始化
├── config.php           站点配置(数据库、调试、时区、站点 key)
│
├── core/                基础层
│   ├── Db.php           PDO 封装(查询构造、事务、表名引用)
│   ├── Auth.php         管理员认证(bcrypt 哈希、会话、口令修改)
│   ├── Csrf.php         CSRF 令牌生成与校验
│   ├── RateLimiter.php  IP 维度服务端限流(落盘 + 原子写 + 故障放行)
│   ├── Skin.php         模板解析与皮肤管理
│   └── Util.php         工具集(转义、输入、URL、图标、分页、IP 等)
│
├── app/model/           模型层
│   ├── Base.php         模型基类(增删改查、分页、排序、条件构造)
│   ├── Link.php         网址(前台查询、投稿、审核、点击、搜索)
│   ├── Category.php     分类(含合并、级联删除)
│   ├── Notice.php       公告
│   ├── Setting.php      系统设置(KV 表 + 分组 + 类型 + 默认值)
│   ├── Schema.php       建表 / 种子数据 / 幂等升级
│   ├── SiteMeta.php     外站信息抓取(SSRF 防护、HTML 解析)
│   ├── WeightQuery.php  搜索权重查询(三数据源 + 自定义适配 + 缓存)
│   ├── BacklinkChecker.php 友链回链自动检测
│   ├── IconUploader.php 图标上传校验与落盘
│   ├── Importer.php     数据导入(CSV / JSON)
│   └── Exporter.php     数据导出
│
├── admin/               后台
│   ├── index.php        后台页面路由(dashboard/categories/links/reviews/notices/settings/...)
│   └── api.php          后台统一 AJAX 接口(POST + 登录态 + CSRF)
│
├── views/               视图模板
│   ├── layout/          前台公共头尾(header / footer)
│   ├── admin/           后台各页面模板 + layout
│   ├── home.php         首页
│   └── notices.php      公告列表
│
├── assets/              前端资源
│   ├── style.css        前台样式(CSS 变量 + 深色模式)
│   ├── app.js           前台公共脚本
│   ├── submit.js        投稿页脚本(抓取、图标选择、校验)
│   ├── detail.js        详情页脚本(权重查询)
│   ├── admin.css        后台样式(含弹窗、响应式)
│   ├── admin.js         后台脚本(弹窗、表单、接口调用)
│   └── lazyload.js      图片懒加载兜底(老浏览器)
│
├── data/                运行时数据(缓存、证书、导出临时文件)
│   ├── cacert.pem       CA 根证书包(HTTPS 校验用)
│   ├── meta_*.dat       抓取结果缓存
│   ├── weight_*.dat     权重查询缓存
│   └── rate_*.dat       限流计数
│
└── uploads/             上传文件(图标等,需可外链访问)
    └── icons/YYYYmm/    按月归档的图标

四、数据模型

系统共 5 张表,全部通过 Schema::create() 建立,Schema::upgrade() 在每次请求时幂等补齐增量字段(老库可平滑升级,无需手工改表)。

用途关键字段
admins管理员账号usernamepassword(bcrypt)、last_login_atlast_login_ip
categories网址分类nameslug(唯一)、iconremarksort_orderstatus
links网址条目category_idtitleurldescriptioniconhitsis_recommendstatussubmitterreview_notebacklink_pass
notices站点公告titlecontenttypeis_topstatussort_order
settings系统设置(KV)k(唯一)、vgroup_name
settings 为键值表,扩展设置项不需要改表结构 —— 在 Setting::DEFAULTS 追加一行并在 Setting::GROUPS 登记分组即可,后台设置页会自动渲染。
未保存过的设置项不落库,读取时回落到默认值。

五、前台功能

页面 / 入口说明
首页 index.php分类导航主体 + 搜索横幅 + 侧栏(热门 TOP10、最新收录、公告)
分类页 index.php?c={slug}单分类下的网址列表,支持排序与分页
搜索 index.php?s={关键词}站内搜索,带高亮与结果计数
公告列表 index.php?p=notices公告分页浏览
投稿 submit.php访客提交网址(可开关),支持一键抓取站点信息、三种图标来源
详情 detail.php?id={id}站点信息、截图、相关推荐、权重查询面板
跳转 go.php?id={id}出站跳转,累加点击量、记录最后点击时间

搜索聚合:七种搜索引擎可切换,用户选择会带参数透传,站内搜索与外部引擎搜索在同一输入框完成。

权重查询(详情页):展示各搜索引擎的权重等级(BR)、收录量与预估流量。支持三种数据源 —— 站长之家、接口盒子、自定义接口,可配置自动或手动触发,查询结果带缓存(默认 6 小时),失败时回退旧缓存并进入冷却期,避免反复打第三方接口。

信息自动抓取:输入网址后点击「自动获取」,服务端抓取目标站点的 <title>description、favicon、og:image 并回填表单。前台投稿场景只填空字段、不覆盖用户手填内容;后台编辑场景直接覆盖(意图是刷新)。触发时机完全由按钮控制,失焦 / 回车均不触发。


六、后台功能

后台入口 admin/index.php,所有 AJAX 请求统一走后端接口(POST + 登录态 + CSRF 校验,响应结构 {code, msg, data})。

页面功能
仪表盘分类数 / 网址数 / 待审数 / 点击量概览
分类管理新增、编辑、排序、启停、合并、级联删除(含关联网址)
网址管理新增、编辑、删除、排序、启停、推荐、批量操作、审核通过 / 驳回、自动获取站点信息
投稿审核待审队列,查看投稿人、回链检测结果,一键通过或驳回并填写备注
公告管理发布、编辑、置顶、启停
系统设置按分组管理的全部配置项(站点 / 首页 / SEO / 列表 / 皮肤 / 投稿 / 权重 / 自定义接口)
数据导入CSV / JSON 导入,支持字段映射,返回导入报告(插入 / 更新 / 跳过 / 失败)
数据导出导出全站数据,生成带 token 的临时下载文件(自动过期清理)
模板切换前台 / 后台皮肤选择
修改密码更新管理员口令(改后强制重新登录)

自定义权重接口:在「自定义权重接口」设置组填写接口地址(支持 {domain} 占位)、请求方式、附加参数与请求头、成功判定条件、数据根路径、字段映射(每行 统一字段=返回字段路径,支持 list[0].Br 这类嵌套路径)。配置完成后可在后台直接做接口连通性测试,返回逐源明细与字段命中情况,不写缓存。


七、配置说明

config.php 返回一个数组,主要键:

说明
debug调试模式,开启后显示全部错误(生产环境请关闭)
timezone时区,默认 Asia/Shanghai
key站点密钥,用于令牌派生
db.drivermysqlsqlite
db.dsnPDO 连接串(MySQL 形如 mysql:host=...;port=...;dbname=...
db.user / db.pass数据库账号
站点名称、LOGO、备案号、SEO、列表条数、投稿开关、权重查询参数等运营配置不在 config.php,而是存在数据库 settings 表中,登录后台「系统设置」即可修改。

config.php 不存在,前台会自动跳转到 install.php 安装向导。


八、安全设计

层面措施
SQL全量参数化查询,表名 / 字段名走白名单,LIKE 通配符转义
XSS输出统一经 Util::e() 转义;前端动态渲染做实体编码,杜绝对不可信数据直接 innerHTML
CSRF后台全部写操作校验令牌(支持表单字段与请求头两种传递)
会话Cookie 设置 HttpOnly + SameSite=Lax,HTTPS 下自动加 Secure
限流RateLimiter 按 IP 维度服务端计数并落盘(抓取 / 上传 / 权重 / 登录四处),不依赖 $_SESSION
SSRF外站抓取前校验协议白名单与端口白名单,同时校验 A 与 AAAA 记录,拒绝内网 / 保留地址;禁用自动重定向,改为手动逐跳并在每一跳前重新校验
上传仅允许图片类型(getimagesize 判定),排除 SVG,限制体积,按年月归档
HTTPS调用第三方接口时校验 CA 根证书(data/cacert.pem),不使用 VERIFYPEER=false 绕过
部署nginx 侧封锁运行时目录(data/.workbuddy/、点文件)、限制上传目录仅静态访问且脚本 404、拦截归档类扩展名

九、运行环境与部署

环境要求

  • PHP ≥ 7.4(推荐 8.1+),需启用 pdo_mysql(或 pdo_sqlite)、mbstringcurlopenssl
  • Web 服务器:nginx + PHP-FPM(或 Apache)
  • 数据库:MySQL 5.7+ / MariaDB 或 SQLite 3

部署步骤

  1. 将项目文件放入站点根目录,确保 data/uploads/ 可写。
  2. 浏览器访问站点,按 install.php 向导填写数据库信息并创建管理员账号。
  3. 安装完成后务必删除或重命名 install.php,防止被重复执行。
  4. 配置 Web 服务器:将站点根指向项目目录;按上文「安全设计」补上目录封锁规则。
  5. 登录后台,在「系统设置」中完善站点名称、LOGO、SEO 等信息。

性能与缓存

  • 抓取结果、权重结果、限流计数均落盘缓存,减少外站请求。
  • 前台资源通过版本号控制缓存;建议对 assets/ 设置较长过期时间。

十、版本与约定速查

版本常量XM_VERSION(位于 bootstrap.php
会话名xmnav_sid
数据库表admins / categories / links / notices / settings
命名空间xm\core\*xm\app\model\*
后台接口admin/api.php,参数 a={动作名},如 a=link.save
后台响应结构{code, msg, data}

改代码时的注意事项

  1. 修改 assets/ 下的任何 CSS / JS 后,必须递增 XM_VERSION,否则浏览器会继续使用旧缓存。
  2. 新增设置项只需改 Setting::DEFAULTSSetting::GROUPS,无需改动数据库结构。
  3. 新增数据表字段请在 Schema::upgrade() 中用 addColumnIfMissing() 追加,保证老库可平滑升级。
  4. 任何出站 HTTP 请求必须先过 SSRF 校验,且禁止开启自动跟随重定向。
官方网站:http://5201317.xyz
演示截图:

火狐截图_2026-09-13T02-42-20.378Z.png
火狐截图_2026-09-13T02-43-18.789Z.png
火狐截图_2026-09-13T02-43-38.706Z.png
火狐截图_2026-09-13T02-43-55.096Z.png
火狐截图_2026-09-13T02-44-09.472Z.png
火狐截图_2026-09-13T02-46-32.071Z.png
火狐截图_2026-09-13T02-45-25.032Z.png
火狐截图_2026-09-13T02-45-07.497Z.png
火狐截图_2026-09-13T02-44-51.617Z.png
火狐截图_2026-09-13T02-44-34.758Z.png
火狐截图_2026-09-13T02-44-20.772Z.png