共84行
2026-03-06 15:43:31
在 Nginx 中实现 URL 省略 .html 后缀,通常有两种主流方案:一种是使用 try_files 指令,这是性能更好、更推荐的方法;另一种是使用 rewrite 指令配合条件判断。
以下是两种方案的具体配置方法:
try_files 指令会按顺序检查指定的文件或目录是否存在,并返回第一个找到的文件。如果都没有找到,则返回最后一个指令定义的结果(如 404 或重定向到某个页面)。
配置示例:
location / {
# 1. 先尝试匹配用户请求的 URI ($uri)
# 2. 如果不是文件,则尝试匹配 URI 加上 .html ($uri.html)
# 3. 如果还不是,则尝试匹配 URI 对应的目录 ($uri/)
# 4. 如果以上都失败,则返回 404
try_files $uri $uri.html $uri/ =404;
}
优点:
try_files 是 Nginx 的原生指令,执行效率比 if 判断更高。location 块中滥用 if 可能会引发一些意想不到的问题,try_files 可以避免这些陷阱。通过 if 判断请求的文件是否不存在(!-e $request_filename),如果不存在,则使用 rewrite 将请求重写到对应的 .html 文件。
配置示例:
location / {
# 如果请求的文件不存在
if (!-e $request_filename) {
# 将请求重写为 $1.html
# last 表示重写后在当前 server 块内重新查找匹配 location
rewrite ^(.*)$ $1.html last;
}
}
注意:
last 标志表示重写后,Nginx 会重新在当前 server 块内查找匹配 location,新的 URI 会再次进行处理,最终找到并返回文件。try_files,这种方法利用了 if 指令,性能稍逊一筹。为了更好的 SEO 效果,你可能希望统一 URL 入口,即只允许访问不带 .html 后缀的链接。当用户访问带后缀的链接时,执行 301 永久重定向到无后缀的链接。
完整配置示例:
# 步骤一:将所有 .html 请求 301 重定向到无后缀版本
# break 标志表示重写后停止处理后续的 rewrite 规则
location ~* \.html$ {
rewrite ^(.*)\.html$ $1 permanent;
}
# 步骤二:处理无后缀的请求,尝试查找对应的 .html 文件
location / {
try_files $uri $uri.html $uri/ =404;
}
同时,为了避免 CSS、JS 等静态资源被错误地添加 .html 后缀,可以显式地定义这些资源的 location 块:
# 排除静态资源目录,确保它们不被重写规则干扰
location ~* ^/(css|js|images|static)/ {
# 静态资源相关配置,如缓存
expires 1y;
add_header Cache-Control "public, immutable";
try_files $uri =404;
}
# 或者针对特定文件后缀
location ~ \.(css|js|png|jpg|gif)$ {
try_files $uri =404;
expires 1M;
}