<p>Nginx 默认对 URI 路径做字面量比较,区分大小写;普通前缀匹配(如 location /admin/)和精确匹配(location = /Login)天然大小写敏感,仅正则匹配中 ~ 为敏感、~* 为不敏感。</p>

在 Nginx 中,静态资源的大小写敏感性由 location 指令的匹配前缀决定,而不是文件系统或 MIME 类型本身。Nginx 默认对 URI 路径做**字面量比较(literal string match)**,即区分大小写;但只有使用正则表达式匹配时,才可通过前缀显式控制是否敏感。
用 ~ 实现大小写敏感匹配
当需要严格区分大小写(比如要求 /API/ 和 /api/ 视为不同路径),应使用 ~ 前缀配合正则表达式:
-
location ~ /API/ { root /var/www/app; }→ 只匹配/API/、/API/v1,不匹配/api/或/Api/ - 正则中可写更精确规则,如
location ~ ^/Static/.*\.(js|css)$→ 仅匹配以大写Static开头的 JS/CSS 请求 - 注意:一旦使用
~,该 location 就属于“正则 location”,参与正则匹配阶段,且优先级高于普通前缀匹配(除非被^~截断)
避免意外不敏感:慎用 ~*
~* 是大小写不敏感的正则匹配,若配置了它,就等于主动关闭了大小写约束:
-
location ~* /images/ { root /data/pics; }→/Images/、/IMAGES/、/images/全部命中 - 如果业务要求路径名严格一致(例如对接遗留系统、OAuth 回调路径、CDN 缓存键一致性),就不能用
~*,否则可能绕过预期权限或缓存策略
普通前缀匹配默认就是大小写敏感
不带任何前缀或使用 =、^~ 的 location,底层采用字节级字符串比对,天然区分大小写:
-
location /admin/ { ... }→ 匹配/admin/,不匹配/Admin/ -
location = /Login { ... }→ 精确匹配/Login,/login会失败并可能落入其他 location 或返回 404 - 这点常被忽略——你不需要额外配置就能获得大小写敏感行为,只要不用
~*或把路径转成小写再匹配
验证与调试建议
实际部署前建议测试几种典型请求:
- 用
curl -I http://localhost/MyScript.js和curl -I http://localhost/myscript.js对比响应状态码和Content-Location - 开启 Nginx error log 的
info级别,查看 access 日志中实际匹配的 location 块(需编译时启用--with-debug或配置error_log /path/debug.log info;) - 注意:文件系统本身的大小写敏感性(如 Linux ext4 区分、Windows NTFS 不区分)会影响最终能否读取到文件,这与 Nginx 的 URI 匹配是两个独立环节


















