NGINX 301移除URL中.html后缀时排除/static路径的配置方法
同location块下排除/static路径的.html重定向实现方案
Nginx 单个location块内的if规则不存在“前置匹配即跳过后续逻辑”的执行顺序,空if块不会产生任何实际作用,不需要单独为/static路径写前置判断块,直接把例外逻辑整合到原有重定向的正则匹配规则里即可,完全符合你不能拆分独立location的环境限制。
直接把你原来的重定向配置替换为以下代码:
if ($request_uri ~ ^/(?!.*?/static/)(.*)\.html$) { return 301 /$1$is_args$args; }
规则细节
- 正则中的
(?!.*?/static/)是PCRE原生支持的负向零宽断言,会自动排除所有路径中包含/static/片段的请求,这类请求不会触发301重定向 - 如果你仅需要排除根目录下的
/static/路径(即只有/static/xxx.html这类以/static开头的请求需要例外,不需要处理路径中间嵌套/static的场景),可以将正则简化为^/(?!static/)(.*)\.html$,匹配效率更高 - 规则保留了原配置里的
$is_args$args参数拼接逻辑,原URL携带的查询参数不会在跳转后丢失
之前尝试的方案失效原因
- 无任何执行指令的空if块不会对Nginx的请求处理流程产生任何影响,自然无法拦截后续的重定向规则
- Nginx的if指令存在大量已知的执行逻辑坑(社区常说的"If is Evil"),不要尝试通过前置if块return、设置临时变量的方式模拟“跳过后续规则”的效果,很容易出现不可预期的匹配错误
- 你之前测试的
return $host$request_uri写法会拼接出带域名的非标准路径,不符合Nginx return跳转的路径格式要求,无法正常生效
内容的提问来源于stack exchange,提问作者Stefan R
相关产品推荐
相关产品推荐

