配置陷阱
Location 匹配
location /api匹配/api、/api/、/api-v2、/apiary— 比预期更宽location /api/(有斜杠)不匹配/api(无斜杠)location = /api精确匹配但不匹配/api/- 正则
location ~优先于最长前缀 — 书写顺序重要
root vs alias
root /var/www; location /img/→ 查找/var/www/img/alias /var/www/; location /img/→ 查找/var/www/(替换 location 路径)alias无尾部斜杠 +location有斜杠 = 路径错误alias搭配正则需要捕获组:alias /var/www$1
try_files
try_files $uri /index.html缺少$uri/— 找不到目录- 最后一个参数是内部重定向,不是文件检查 — 行为不同
try_files+proxy_pass在同一个 location = try_files 总是优先=404作为 fallback 是状态码,不是文件 —/404才是文件
if 语句
if创建新的上下文 — 继承的指令可能不生效if ($request_uri ~* \.php)在已处理的 location 中 = 无意义的重复检查if中的return和rewrite正常工作 — 其他指令有问题- 多个
if不会用 AND 组合 — 每个if独立
变量
$uri是解码后的规范化路径 —$request_uri是原始值- 未定义变量 = 空字符串,不报错
if块内的set总是执行 — 只有块内其他指令是条件性的map比多个if更高效,适合 switch/case 场景
include
include /etc/nginx/conf.d/*.conf— 按字母顺序排列,可能有影响- 包含不存在的文件 = nginx 无法启动
- 相对路径是相对于 nginx.conf,不是当前文件
- 循环 include = nginx 启动报错但提示不清晰