Skip to content

Rewrite模块

Rewrite模块用于URL重写,实现URL重定向和重写。

基本配置

基本重写

nginx
rewrite ^/old/(.*)$ /new/$1 permanent;

条件重写

nginx
if ($request_uri ~* "^/old/(.*)$") {
    rewrite ^/new/$1 permanent;
}

完整配置

生产环境配置

nginx
server {
    listen 80;
    server_name www.example.com;

    # 重定向到HTTPS
    return 301 https://$server_name$request_uri;

    # 重写URL
    rewrite ^/old/(.*)$ /new/$1 permanent;

    # 去掉www
    if ($host ~* ^www\.(.*)$) {
        set $host_without_www $1;
        rewrite ^(.*)$ http://$host_without_www$1 permanent;
    }
}

常用指令

rewrite

nginx
rewrite regex replacement flag;

说明:

  • regex:正则表达式
  • replacement:替换字符串
  • flag:标志

标志:

  • last:停止处理当前规则,重新开始搜索
  • break:停止处理当前规则
  • redirect:302临时重定向
  • permanent:301永久重定向

if

nginx
if (condition) {
    ...
}

说明:

  • 条件判断
  • 支持多种条件

常用场景

HTTP跳转HTTPS

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

去掉www

nginx
server {
    listen 80;
    server_name www.example.com example.com;

    if ($host ~* ^www\.(.*)$) {
        set $host_without_www $1;
        rewrite ^(.*)$ http://$host_without_www$1 permanent;
    }
}

添加www

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

URL重写

nginx
rewrite ^/old/(.*)$ /new/$1 permanent;

去掉尾部斜杠

nginx
rewrite ^(.+)/$ $1 permanent;

添加尾部斜杠

nginx
rewrite ^(.*[^/])$ $1/ permanent;

完整示例

生产环境配置

nginx
server {
    listen 80;
    server_name example.com www.example.com;

    # HTTP跳转HTTPS
    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    # 去掉www
    if ($host ~* ^www\.(.*)$) {
        set $host_without_www $1;
        rewrite ^(.*)$ https://$host_without_www$1 permanent;
    }

    root /var/www/html;
    index index.html;

    # URL重写
    rewrite ^/old/(.*)$ /new/$1 permanent;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
}

常见问题

重写循环

原因: 重写规则配置错误

解决: 检查重写规则

nginx
rewrite ^/old/(.*)$ /new/$1 permanent;

重写不生效

原因: 正则表达式错误

解决: 检查正则表达式

nginx
rewrite ^/old/(.*)$ /new/$1 permanent;

总结

Rewrite模块的关键点:

  • rewrite:URL重写
  • if:条件判断
  • 标志:last、break、redirect、permanent
  • 常用场景:HTTP跳转HTTPS、去掉www、URL重写

合理配置Rewrite模块,实现URL重定向和重写。