共84行

nginx ,省略url末尾带.html

2026-03-06 15:43:31

在 Nginx 中实现 URL 省略 .html 后缀,通常有两种主流方案:一种是使用 try_files 指令,这是性能更好、更推荐的方法;另一种是使用 rewrite 指令配合条件判断。

以下是两种方案的具体配置方法:

🚀 方案一:使用 try_files 指令(推荐)

try_files 指令会按顺序检查指定的文件或目录是否存在,并返回第一个找到的文件。如果都没有找到,则返回最后一个指令定义的结果(如 404 或重定向到某个页面)。

配置示例:

location / {
    # 1. 先尝试匹配用户请求的 URI ($uri)
    # 2. 如果不是文件,则尝试匹配 URI 加上 .html ($uri.html)
    # 3. 如果还不是,则尝试匹配 URI 对应的目录 ($uri/)
    # 4. 如果以上都失败,则返回 404
    try_files $uri $uri.html $uri/ =404;
}

优点:

⚙️ 方案二:使用 rewrite 指令

通过 if 判断请求的文件是否不存在(!-e $request_filename),如果不存在,则使用 rewrite 将请求重写到对应的 .html 文件。

配置示例:

location / {
    # 如果请求的文件不存在
    if (!-e $request_filename) {
        # 将请求重写为 $1.html
        # last 表示重写后在当前 server 块内重新查找匹配 location
        rewrite ^(.*)$ $1.html last;
    }
}

注意:

🛡️ 进阶配置:SEO 友好与冲突避免

为了更好的 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;
}