nginx仅在四条件同时满足时自动301补斜杠:请求路径对应真实目录、uri末尾无斜杠、无精确location匹配、未使用proxy_pass等代理指令;否则不触发。

默认就会补,但只在特定条件下触发;多数人配了 rewrite 反而引入 301 循环或跳转到错误域名,本质是没搞清触发条件和重定向地址生成逻辑。
什么时候 Nginx 会自动 301 补斜杠?
不是所有目录请求都会跳转,只有同时满足这四个条件时才发生:
-
request_uri对应的路径在磁盘上真实存在且是目录(如/var/www/app/存在) - URI 末尾没有斜杠(如访问
/app,而非/app/) - 当前
location块中没有显式匹配该路径(即没有location = /app或location ^~ /app) - 该
location没有使用proxy_pass、fastcgi_pass等代理指令(否则 Nginx 不查本地文件系统)
不满足任一条件,就不会自动跳转——比如你写了 location /app { proxy_pass http://upstream; },那 /app 就不会补斜杠,因为请求根本没走到文件系统检查环节。
为什么 rewrite if (-d $request_filename) 容易出错?
这个写法看似直觉,但实际埋了三个坑:
-
$request_filename是拼接root后的绝对路径,但if在location外部时可能还没解析root,导致判断永远为假 - 重定向地址硬写
http://$host/...,如果请求带端口(如:8080),$host不含端口,跳转后丢失端口 → 404 或 403 - 用
$host而非$http_host,当 Host 头被篡改或含端口时,跳转目标不可控
正确写法应优先用 $http_host(保留原始 Host+端口),并确保 if 在有明确 root 的 location 内:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
location /app {
root /var/www;
if (-d $request_filename) {
rewrite ^/(.*)([^/])$ https://$http_host/$1$2/ permanent;
}
}
怎么控制跳转后的域名和端口?
关键看这三个指令的组合:
-
absolute_redirect on(默认):启用绝对重定向,地址由后续两个指令决定 -
server_name_in_redirect off(Nginx ≥0.8.48 默认值):用原始请求中的 Host 头,含端口 -
port_in_redirect off(默认):如果原始请求是标准端口(80/443),重定向地址不显式带端口;非标端口则保留
所以,默认配置下访问 http://example.com:8080/app,会 301 到 http://example.com:8080/app/;但如果 server_name_in_redirect on 且 server_name api.example.com,就会跳到 http://api.example.com/app/——这在负载均衡或微信回调场景下极易出错。
想禁用自动补斜杠,最稳妥的方式是什么?
别删目录或改权限,直接切断触发链:
- 加一条精确匹配的
location = /app,内容可以是return 404;或try_files $uri $uri/ =404; - 或者在对应
location里加alias而非root,因为alias下的路径映射不触发目录检查逻辑 - 若用了
proxy_pass,本就不会触发,无需额外操作
注意:autoindex off 和 index index.html 不影响是否补斜杠,它们只控制“补完之后怎么处理请求”,不是开关本身。










