插件窝 干货文章 Nginx重写URL配置实战,优化网站结构和SEO

Nginx重写URL配置实战,优化网站结构和SEO

重写 rewrite Nginx URL 968    来源:    2025-04-16

Nginx URL重写配置实战指南

一、URL重写基础概念

URL重写(URL Rewriting)是指在不改变实际内容的情况下,修改用户浏览器中显示的URL地址。Nginx通过rewrite指令实现这一功能。

主要用途:

  1. 优化网站结构,使URL更加友好
  2. 实现旧URL到新URL的301重定向
  3. 隐藏技术细节,提高安全性
  4. 提升SEO效果

二、Nginx rewrite指令详解

基本语法:

rewrite regex replacement [flag];

常用flag参数:

  • last - 停止处理当前rewrite指令集,用新URI重新匹配location
  • break - 停止处理当前rewrite指令集
  • redirect - 返回302临时重定向
  • permanent - 返回301永久重定向

三、实战配置示例

1. 基础重写示例

# 将 /product/123 重写为 /product.php?id=123
rewrite ^/product/(\d+)$ /product.php?id=$1 last;

2. 移除index.php

# 将 /index.php/foo/bar 重写为 /foo/bar
rewrite ^/index\.php/(.*) /$1 permanent;

3. 强制HTTPS

if ($scheme != "https") {
    rewrite ^ https://$host$request_uri? permanent;
}

4. 统一域名(带www和不带www)

server {
    listen 80;
    server_name example.com;
    return 301 $scheme://www.example.com$request_uri;
}

server {
    listen 80;
    server_name www.example.com;
    # 主配置内容
}

5. 移除URL中的.php扩展名

# 将 /about 重写为 /about.php
rewrite ^/([^/\.]+)/?$ /$1.php last;

# 确保直接访问.php文件时重定向到无扩展名URL
if ($request_uri ~ ^/(.*)\.php$) {
    return 301 /$1;
}

6. 多参数URL美化

# 将 /category/5/page/2 重写为 /category.php?id=5&page=2
rewrite ^/category/(\d+)/page/(\d+)$ /category.php?id=$1&page=$2 last;

四、SEO优化最佳实践

  1. 301重定向:确保旧URL正确重定向到新URL

    rewrite ^/old-page$ /new-page permanent;
    
  2. 规范化URL:统一URL格式(尾部斜杠、大小写等)

    # 确保URL以斜杠结尾
    rewrite ^/(.*[^/])$ /$1/ permanent;
    
  3. 避免重复内容:防止同一内容通过多个URL访问

    # 防止带参数的重复URL
    if ($args ~* "^(.*)&?utm_[^=]+=[^&]*(?:&(.*))?$") {
       set $args $1$2;
       rewrite ^(.*)$ $1? permanent;
    }
    
  4. 静态化动态URL:提升搜索引擎友好度

    rewrite ^/products/([a-z0-9-]+)-([0-9]+)\.html$ /product.php?name=$1&id=$2 last;
    

五、高级技巧

1. 条件重写

# 仅当不是真实文件或目录时才重写
if (!-e $request_filename) {
    rewrite ^/(.*)$ /index.php?q=$1 last;
}

2. 多级目录重写

# 将 /blog/2023/05/20/sample-post 重写为 /blog.php?year=2023&month=05&day=20&post=sample-post
rewrite ^/blog/(\d{4})/(\d{2})/(\d{2})/([^/]+)/?$ /blog.php?year=$1&month=$2&day=$3&post=$4 last;

3. 移动设备重定向

set $mobile_rewrite do_not_perform;

if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino") {
    set $mobile_rewrite perform;
}

if ($mobile_rewrite = perform) {
    rewrite ^(.*)$ /mobile$1 last;
}

六、调试与测试

  1. 测试配置语法

    nginx -t
    
  2. 查看重写日志

    rewrite_log on;
    error_log /var/log/nginx/error.log notice;
    
  3. 使用curl测试

    curl -I http://example.com/old-url
    

七、注意事项

  1. 避免重写循环 - 确保重写规则不会无限循环
  2. 考虑性能 - 复杂的正则表达式会影响性能
  3. 保持一致性 - 确保所有相关URL都正确处理
  4. 测试全面 - 在生产环境部署前充分测试

通过合理配置Nginx的URL重写规则,可以显著提升网站的用户体验和SEO效果,同时保持后端系统的简洁性。