去年做一个小程序,备案这件事我以为走一遍流程就完了。实际办下来才发现, 「备案」不是一件事,是至少三件事,分属两个部门,各有各的编号,互不通用。
这篇把三份备案的关系、个人主体的边界、以及一个我实际犯过的错误写清楚。
| 备案 | 主管部门 | 办的地方 | 时限 |
|---|---|---|---|
| ICP 备案 域名 |
通信管理局 (工信部体系) |
通过云厂商提交 | 7–20 个 工作日 |
| 小程序备案 应用 |
通信管理局 | 微信公众平台 | 1–20 个 工作日 |
| 公安联网备案 网站 + 应用 |
公安网安 | beian.mps.gov.cn | 联网运行起 30 日内 |
三者的关系不是「先 A 后 B」这种简单串行:
最容易被忽略的是第三份。它的法律依据在《计算机信息网络国际联网安全保护管理办法》第十二条, 逾期未办的处罚写在第二十三条——警告或者停机整顿不超过六个月。这不是可以拖的事。
这一条比流程本身重要。备案系统里填的「网站名称」和「服务内容」, 审核方会打开你的网站核对。不一致的后果是驳回或限期整改。
我见过三种典型的不一致:
处理方式只有两个:改备案信息,或者改网站内容。没有第三条路。
如果网站还没做完就去提交备案,最好先在域名上放一个最简的说明页——一页 HTML, 写清站点名称、大致内容和联系方式。审核员打开能看到东西, 比打开是「无法访问」或「403」要好得多。
有一种常见情况:域名只用来给小程序提供接口,根路径不放任何面向用户的页面。 这类域名在备案时会有点尴尬——既没有内容可核对,又需要履行「首页底部悬挂备案号」的义务。
我的处理方式是根路径返回一页极简静态页,只有三行:
<!doctype html>
<title>服务说明</title>
<p>本域名仅提供某小程序的接口服务,不面向公众提供网页内容。</p>
<p><a href="https://beian.miit.gov.cn/">某ICP备XXXXXXXXXX号</a></p>
这样既满足悬挂义务,又不会让「纯接口域名」的定性变成「有面向公众的网页内容」。 页面里刻意不放任何业务介绍、联系方式、产品截图——多放一样,性质就变了。
Nginx 侧对应的配置是:
location = / {
root /var/www/html;
try_files /index.html =404;
}
location /api/ {
proxy_pass http://127.0.0.1:3000;
}
location / {
return 404;
}
个人备案能做的事,比很多人想的窄。几条硬边界:
最后一条对我影响最大。原本想做的是一个「云端备份」功能,后来把定位改成 「本地文件整理工具 + 可选的加密备份」,容量作为会员权益的一项而不是售卖的资源—— 同样的技术,表述方式不同,定性就不同。
这件事值得单独写一节。
域名备案通过后,我拿到了 ICP 号。过了一段时间,听说还有一份公安联网备案要办, 就去查了一下,在某处搜到一个「闽公网安备XXXXXXXXXXXXXX号」,看着格式对、地区对, 就直接挂到了首页上,以为这件事办完了。
后来才发现:那个号根本不是我的域名。
问题出在判断方式上。公安备案号的格式是「省简称 + 公网安备 + 区划码 + 序号」, 区划码只表示受理的区县,不能用来判断归属。用搜索引擎或者按规律猜,得到的号和你没有关系。
挂错号的后果比不挂更重:性质是虚假悬挂,会被要求立即整改, 情节严重时按第二十三条一并处理。而如果确实还没办,页面上就不该出现那一行。
正确的确认方式只有一个:登录 beian.mps.gov.cn,在「我的备案」里看那条记录
绑定的域名和主体是不是自己。系统里没有,就是没办。
顺带一个技术上的处理:如果是用脚本生成备案页,那么「没填就整行不渲染」比「显示待补充」要好。 后者等于在公网首页上对外宣告自己还没办完。
ICP_LINE=""
POLICE_LINE=""
[[ -n "$ICP_NO" ]] && ICP_LINE="<p>$ICP_NO</p>"
[[ -n "$POLICE_NO" ]] && POLICE_LINE="<p>$POLICE_NO</p>"
# 模板里只放变量,值为空时那一行就不存在
备案这件事的难点不在流程,在于它约束的是产品定性,不是代码。 同样一个功能,叫「云端空间」还是叫「备份权益」,过一次审核的结果可能完全不同。
所以正确的顺序是:先想清楚要做什么,对照边界判断它属于哪一类,再决定怎么写文案、选什么类目、办哪几份备案。 反过来做——先写代码再补手续——几乎一定会返工。