2.4 伪静态、跨域与访问控制类问题
先给一个判断
这一节的问题都有个共同特征:网站明明能打开,就是“某些功能不对劲”。 首页正常、文章页 404,是伪静态;页面正常、接口报 CORS,是跨域;页面正常、某些目录打不开,是访问控制或防盗链。这类问题不致命,但极其影响体验,而且排查需要一点耐心——因为它们的配置都藏在网站配置的各个标签页里。
现象速查:先判断属于哪一类
| 现象 | 典型表现 | 属于哪类 | 配置入口 |
|---|---|---|---|
| 首页正常,内页 404 | /article/123 打不开,/index.php?p=123 能开 |
伪静态 | 网站配置 → 伪静态 |
| 接口跨域报错 | 浏览器控制台 CORS policy |
跨域(CORS) | 网站配置 → CORS |
| 接口 405 / 方法不允许 | GET 正常 POST 不行 | CORS 允许方法 | 网站配置 → CORS |
| 图片显示裂图 | 别站盗链你的图 | 防盗链 | 网站配置 → 防盗链 |
| 静态资源 403 | 换域名后资源加载不了 | 防盗链或权限 | 防盗链 / 网站目录 |
| 要密码才能访问 | 所有页面弹登录框 | 密码访问 | 网站配置 → 密码访问 |
| 旧链接跳新地址 | 访问老 URL 自动跳走 | 重定向 | 网站配置 → 重定向 |
一个共同点:这些功能全都在网站列表 → 【配置】里,而且全是“网站级别”的设置——一个网站配错了不影响别的网站。所以排查时范围先锁定到一个网站的配置页,别往服务器层面想太远。
修复:伪静态不生效
伪静态的作用是把 /article/123 这种“假静态路径”转给动态程序处理(02-0 里讲过)。判断伪静态有没有问题,有个秒判技巧:把伪静态规则临时关掉,如果动态路径(带问号那种)能打开,那就是伪静态规则的事。
第一步:规则对不对。 1Panel 内置了常见程序的规则模板,直接选对应程序即可(WordPress、ThinkPHP 等)。如果自己写,注意规则要和你程序的路由方式匹配——同一个 WordPress,固定链接格式不同,规则也不同。比如把固定链接设成 /archives/%post_id%.html,伪静态规则就得认识 archives 这个前缀,照抄别人的规则很可能对不上。
第二步:生效顺序。 伪静态本质上是 OpenResty 的 rewrite 规则。改完保存后,确认是否需要重载 OpenResty(网站列表上方工具栏,不停机应用新配置)。“我改了啊怎么没生效”这句抱怨,九成是因为少了重载这一步。
第三步:别和“重定向”打架。 网站配置里“重定向”也能改 URL 行为,两条规则撞在一起,就会出现“跳来跳去停不下来”的死循环。伪静态和重定向不要配同一条路径。一个简单的判断方法:伪静态是“内部改写”(地址栏不变),重定向是“让浏览器跳走”(地址栏会变)。地址栏变了还停不下来,就去查重定向。
修复:跨域(CORS)
先区分两种 404 之外的接口错误:
| 浏览器控制台报错 | 真正的原因 | 改哪里 |
|---|---|---|
CORS policy: No 'Access-Control-Allow-Origin' |
没配 CORS 或来源不匹配 | 网站配置 → CORS |
CORS policy: Method ... not allowed |
允许方法没包含POST/PUT | CORS 的“方法” |
CORS policy: Credentials flag |
带凭证但来源是通配 | CORS 的“允许来源” |
Network Error / 502 |
接口本身没通 | 看 2.2 节 |
配置要点:
- 允许来源写具体域名(
https://你的域名),一行一个; - 允许携带凭证时,来源不能用通配范围——这是浏览器的硬规范,官方文档在 CORS 一节也明确写了“允许携带凭证时不能把允许来源配置为不受限制的通配范围”;
- 允许方法按实际需要勾,别全部通配,出事了不好查;
- 预检请求缓存时间适当调大,能减少 OPTIONS 请求。
一个常见误判:本地开发时
localhost:3000调线上接口报 CORS,就跑去找服务器配置——其实浏览器已经把 OPTIONS 预检发出去了,服务端也回了,但来源不匹配。先看控制台的“请求头”里的 Origin 是什么,再对照你配的允许来源,一眼就能看出对不对。
修复:防盗链与静态资源 403
防盗链的原理是检查请求来源(Referer),不是你允许的域名就拦下来。翻车现场通常是:换域名、加 CDN、或者自己的新子域名没加进白名单,结果自己的图片都显示不出来。
处理:防盗链白名单里加上所有合法来源;注意开了 CDN 的情况,Referer 可能变成 CDN 节点,实在分不清可以先临时关掉防盗链验证是不是它的问题。
静态资源 403 也可能是文件权限问题(网站目录的运行用户/用户组设置),用这条命令看:
# 看目录权限和属主(路径换成你的网站目录)
ls -ld /opt/1panel/www/sites/你的网站/index/
权限处理见 5.3 节,核心原则:目录权限最小化,别用 0777。
还有一个方向:防盗链规则看的是 Referer,有些浏览器隐私设置会剥掉 Referer(无痕模式、某些隐私浏览器),这时你的防盗链可能误杀正常用户。如果死活查不出原因,先临时关掉防盗链对照测试,是最快的定位手段。
修复:密码访问与流量限制的“怪现象”
两个容易被忘记的配置:
| 你看到的现象 | 其实是你配了什么 |
|---|---|
| 网站每次打开弹登录框 | 网站配置 → 密码访问(支持全局或按路径) |
| 网站突然很慢、部分请求 502 | 网站配置 → 流量限制达到了阈值 |
密码访问支持全局配置和按路径配置。常见误伤:给 /admin 配了密码,结果后台某个接口也在这个路径下,接口请求被弹回来,表现为“后台咋坏了”。处理办法:把接口路径排除或调整密码访问范围。配完密码访问自己一定要测一次,不然第一个被锁在外面的人往往是你自己。
流量限制没配过不会生效,配过之后忘了,就会出现“一到高峰期就 502”的灵异事件——这不是服务器不行,是你自己限速了。看到网站间歇性慢,先去网站配置的流量限制页看一眼,比查半天监控快。
一个完整的复现与修复
现象:WordPress 网站迁移到 1Panel 后,首页正常,点任何文章都 404。
排查过程:
- 先怀疑伪静态——进网站配置看伪静态,是空的(迁移时没带过来)。
- 在伪静态页面选 WordPress 规则模板,保存。
- 重载 OpenResty,刷新,文章页还是 404——再看 WordPress 后台的固定链接设置,是“文章名”格式,而规则模板默认对应的是另一种格式。
- 把规则换成和固定链接匹配的,重载,恢复。
复盘:迁移网站最容易丢的就是三类配置——伪静态规则、Nginx 自定义配置、HTTPS 证书。迁移前最好把旧网站的配置逐项截图存档,新网站逐项对照。另外,伪静态规则一定要和程序后台的链接格式设置匹配,不是选个模板就万事大吉。
一个排查_access_类问题的通用思路
这类“部分能访问、部分不能”的问题,通用排查顺序:
- 先确定是前端还是后端——F12 打开浏览器控制台,看网络面板里哪个请求红了;
- 看红的请求是什么状态——404(路径不存在)、403(权限/防盗链)、CORS(跨域);
- 对照网站配置的对应标签页检查规则;
- 改一项、验证一次,别一次改三个地方。
这套顺序看着笨,但“部分不对劲”的问题最怕乱试——你同时改了伪静态、CORS 和防盗链三个地方,好了也不知道是哪个起的作用,配置从此变成一团乱麻。
# 服务器侧验证某个路径的返回(绕过浏览器)
curl -I http://你的域名/你的路径/
# 带来源头测试防盗链
curl -I -H "Referer: https://别人的域名/" http://你的域名/图片.jpg
本节要点
- 内页 404 先查伪静态,动态路径能开就是规则的事;
- CORS 带凭证不能用通配来源,先看控制台里的 Origin 再配;
- 防盗链误伤自己的情况最多,换域名/加 CDN 后记得更新白名单;
- “密码访问”和“流量限制”是两个容易被忘的配置;
- 排查“部分不对劲”的问题,从浏览器 F12 的网络面板开始最准。
这些配置的具体位置和参数以 1Panel 官方文档:网站配置 为准,不同版本可能有差异。
下一节:网站的事告一段落。如果后端数据库连不上、备份恢复失败、应用装不上,我们进入第三章——数据库与应用排错。
