yeg
2026-09-28 6e5c03ecccd3941b014988b6c858a89084047ce1
docs(server): 记录域名接入与 origin 随域名变化重演

域名 www.dqrcfwpt.com 解析到 117.172.73.106。访问必须带端口 —— http://www.dqrcfwpt.com:8081:80/443 要备案号才能开,实测不带端口是超时。退域名 dqrcfwpt.com 无 A 记录(公网解析器 ENODATA)。nginx 的 server_name _ 是通配,域名访问无需改站点配置。

用域名访问后 CORS_ALLOWED_ORIGINS 必须同步加 http://www.dqrcfwpt.com:8081,否则登录再次 403 Invalid CORS request —— 同一个坑当天演了第二次(先是 IP,后是域名)。所以把规律补进 08 号文 §8.4:origin 由「协议 + 主机 + 端口」共同决定,任一变化都要单独加;http://host:8081 与 https://host 是两个不同 origin。
2个文件已修改
12 ■■■■■ 已修改文件
.scratch/server-testenv/README.md 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/huifu/08-上线与环境.md 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.scratch/server-testenv/README.md
@@ -34,7 +34,7 @@
| `SERVER_ADDRESS` | 后端只绑 `127.0.0.1`,对外一律经 nginx。 |
| `UPLOAD_DIR` | 上传目录指到 `/data`(系统盘只有 40G)。 |
| `APP_PRIVACY_ENCRYPTION_KEY` | 默认值是**仓库里公开的开发 key**。`SensitiveDataCrypto` 是 `SHA-256(该字符串)` 派生 AES key,所以任意字符串合法。**必须在写入任何隐私数据之前设**——事后换会让旧数据解不开。 |
| `CORS_ALLOWED_ORIGINS` | **必须包含浏览器实际访问的 origin,哪怕是同源。** 浏览器对同源的非简单请求(POST + JSON)也会带 `Origin` 头,而 `ApiCorsConfig` 只要看到 `Origin` 就按白名单校验,不在名单里直接 **403 `Invalid CORS request`**。漏了它的症状就是「登录 403」。 |
| `CORS_ALLOWED_ORIGINS` | **必须包含浏览器实际访问的 origin,哪怕是同源。** 浏览器对同源的非简单请求(POST + JSON)也会带 `Origin` 头,而 `ApiCorsConfig` 只要看到 `Origin` 就按白名单校验,不在名单里直接 **403 `Invalid CORS request`**。漏了它的症状就是「登录 403」。当前值:`http://117.172.73.106:8081`、`http://117.172.73.106:8082`、`http://www.dqrcfwpt.com:8081`、`https://www.dqrcfwpt.com`(后者为将来上 TLS 预留)。**换域名 / 换端口 / 换协议都会换 origin,都要补** —— 2026-09-22 因为换域名又踩了一次。 |
`allowed-origin-patterns`(`http://localhost:[*]`)没被覆盖,所以本地 vite / HBuilderX 调试来源照旧放行。
@@ -61,6 +61,10 @@
  `.scratch/pending-order-payment-flow/README.md` 的 F1)。收敛靠读接口惰性查询 + 60 秒一轮的对账快车道,
  订单不会卡住。要收回调得等备案域名。
- **8081 对全公网开放且是纯 HTTP**(无 TLS),token 明文传输。已确认接受(测试环境)。
- **域名**:`www.dqrcfwpt.com` → `117.172.73.106`(2026-09-22 解析)。**访问必须带端口**:
  `http://www.dqrcfwpt.com:8081` —— 80/443 未备案开不出来,实测不带端口是超时。退域名 `dqrcfwpt.com`
  **没有 A 记录**(公网解析器确认 `ENODATA`),要用不带 www 的形式得先补记录。
- nginx 的 `server_name _` 是通配,所以域名访问无需改站点配置(实测 `http://www.dqrcfwpt.com:8081/` 返回 200)。
- 数据库:`talent_card`,字符集 `utf8mb4` / `utf8mb4_0900_ai_ci`(与测试库同口径,
  照 `ResetTestDatabase.java` 只写 charset 不写 collate;**不要**照抄 `init-local-mysql.sql` 的 `utf8mb4_unicode_ci`,那是 5.7 开发库用的)。
- MySQL 8.4 上迁移里的 7 条 `VALUES() is deprecated`(1287)仍可运行,但该语法未来版本会被移除。
docs/huifu/08-上线与环境.md
@@ -335,6 +335,12 @@
它覆盖本机随机端口的调试来源、**与精确白名单是两个键**,覆盖 `CORS_ALLOWED_ORIGINS` 不会动它——
所以本地 vite / HBuilderX 调试不受影响。**上线时把真实域名加进 `CORS_ALLOWED_ORIGINS` 即可。**
**这条坑会跟着域名的每一次变化重演。** origin 由「协议 + 主机 + 端口」三者共同决定,**任何一个变了
都是一个新 origin,都要单独加**。2026-09-22 一天里演了两次:先用 IP 访问(`http://117.172.73.106:8081`)
踩了一次;把域名 `www.dqrcfwpt.com` 解析好、**改用域名访问又踩了一次**(登录再次 403,表现与第一次
一模一样)。所以:**换域名、换端口、上 HTTPS 都要同步改这个变量**;`http://host:8081` 与 `https://host`
是两个不同 origin,端口不同也是两个。
**4. 凭据要逐条过一遍「弱口令」口径。** 政务云的安全扫描不是形式主义——2026-09-22 它**真的登进来了一次**
(抓到请求体 `{"account":"admin","password":"123456"}`,响应 200 带 `accessToken`)。部署时以下三件事一起做: