发个链接给同事,对方点开却跳转到错误页面;写个脚本读取 API,结果一直返回 404;配置 Nginx 时,/static/ 和 /static 少了个斜杠,图片全挂了——这些都不是玄学,是网络符号标识没用对。
URL 里的斜杠,真不是可有可无
很多人以为 https://api.example.com/v1/user 和 https://api.example.com/v1/user/ 是一回事。其实不少后端框架(比如 Flask、Django 默认配置)会把后者当成一个「目录」处理,前者则是具体资源。浏览器访问时可能自动补斜杠,但 curl 或代码请求不会。实测:
curl -I https://httpbin.org/get # 返回 200
curl -I https://httpbin.org/get/ # 也返回 200(它兼容)
curl -I https://jsonplaceholder.typicode.com/posts/1 # 200
curl -I https://jsonplaceholder.typicode.com/posts/1/ # 404所以,调接口前先看文档里写的路径带不带尾部斜杠,别靠猜。
查询参数里的等号和 &,空格要小心
想传个带空格的用户名:?name=Jack Ma,直接拼进去,后端收到的可能是 Jack+Ma 或 Jack%20Ma。这不是 bug,是 URL 编码规则在起作用。浏览器地址栏会自动编码,但手写字符串或 JS 拼接时容易漏:
// ❌ 错误写法
const url = `https://site.com/search?keyword=${input}`;
// ✅ 正确写法
const url = `https://site.com/search?keyword=${encodeURIComponent(input)}`;中文、括号、#、? 这些符号都得 encode,不然轻则参数截断,重则整个 URL 解析失败。
锚点不只是跳转,还能控制单页应用路由
https://example.com/#/dashboard 里的 # 后面那段,叫片段标识符(fragment identifier)。它不发给服务器,只在前端生效。Vue Router 默认 hash 模式就靠它。你刷新页面,URL 里带 #,地址栏变了,但服务器根本不知道——所以 Nginx 不用为 /#/xxx 额外配 location 规则。不过要注意:# 后面的内容不能包含未编码的 <、>、空格等,否则部分老浏览器会截断。
状态码不是数字游戏,是通信语言
看到 302 就以为是跳转?未必。有些 CDN 把 302 当缓存绕过信号,而 307 才真正保留原始请求方法(比如 POST 不变)。调试时别光盯响应体,顺手看看响应头里的 Status 和 Location:
HTTP/2 307 Temporary Redirect
Location: https://new-api.example.com/v2/data这时候你该检查是不是客户端逻辑把 POST 改成了 GET——302 允许改,307 不允许。
路径中的点号,比你想的更敏感
../config.json 看着平常,但用在 Web 资源加载里就危险。现代浏览器对 .. 做了限制,比如从 https://a.com/js/app.js 加载 ../css/style.css,实际请求的是 https://a.com/css/style.css,而不是跳出域名。但如果你在本地 file:// 协议下测试,或者某些老旧环境里,.. 可能被解析成真实文件系统路径,引发越权读取。生产环境尽量用绝对路径或 base 标签统一管理。