Nginx Rewrite教程:从入门到精通

Nginx Rewrite 教程:从入门到精通

Nginx 是一款高性能的 Web 服务器和反向代理服务器,其 Rewrite 模块功能强大,允许你根据 URL 地址进行重写、重定向和访问控制。本文将带你从入门到精通,逐步学习 Nginx Rewrite 的使用方法和技巧。

一、Rewrite 基础概念

  1. 什么是 Rewrite?

Rewrite 指的是 URL 重写,通过修改 URL 的一部分或全部,实现 URL 的跳转、隐藏真实地址、优化 SEO 等功能。Nginx 的 Rewrite 模块基于 PCRE(Perl Compatible Regular Expressions)正则表达式引擎,提供灵活的 URL 操作。

  1. Rewrite 指令

Nginx 的 Rewrite 模块主要通过以下指令实现 URL 重写:

  • rewrite regex replacement [flag]; 这是最常用的指令,用于根据正则表达式匹配 URL 并进行替换。
  • if (condition) { ... } 用于根据条件判断是否执行 Rewrite 规则。
  • return code; 用于直接返回 HTTP 状态码,例如 301、302、403 等。
  • break; 用于停止当前 Rewrite 规则的执行。
  • last; 停止当前 Rewrite 规则的执行,并重新发起新的 location 匹配。
  • permanent; 返回 301 永久重定向。
  • redirect; 返回 302 临时重定向。

  • flag 参数

rewrite 指令的 flag 参数用于控制 Rewrite 行为:

  • last: 停止处理当前的 rewrite 规则集,并对新的 URL 重新发起 location 匹配。
  • break: 停止处理当前的 rewrite 规则集。
  • redirect: 返回 302 临时重定向。
  • permanent: 返回 301 永久重定向。

二、入门示例

让我们从一个简单的例子开始,将所有访问 /oldpage.html 的请求重定向到 /newpage.html

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

location /oldpage.html {
    rewrite ^/oldpage.html$ /newpage.html permanent;
}

location /newpage.html {
    # ... new page content ...
}

}
```

在这个例子中,rewrite ^/oldpage.html$ /newpage.html permanent; 将匹配 /oldpage.html 并将其重写为 /newpage.htmlpermanent 参数表示使用 301 永久重定向。

三、正则表达式基础

Nginx Rewrite heavily relies on regular expressions. Here's a quick overview of commonly used regex elements:

  • ^: 匹配字符串的开头。
  • $: 匹配字符串的结尾。
  • *: 匹配前一个字符零次或多次。
  • +: 匹配前一个字符一次或多次。
  • ?: 匹配前一个字符零次或一次。
  • . : 匹配除换行符之外的任何单个字符。
  • ( ): 用于捕获匹配的子字符串,可以使用 $1, $2 等变量引用。
  • [ ]: 匹配括号内的任意一个字符。
  • |: 或运算符。

四、高级用法

  1. if 指令

if 指令可以根据条件判断是否执行 Rewrite 规则。例如,判断 User-Agent 是否为移动设备:

nginx
if ($http_user_agent ~* (mobile|android|iphone)) {
rewrite ^/$ /mobile/ index.html break;
}

  1. return 指令

return 指令可以直接返回 HTTP 状态码,例如阻止访问特定文件:

nginx
location ~ /\.ht {
return 403;
}

  1. Rewrite Maps

Rewrite Maps 允许你使用外部文件或变量定义复杂的映射关系。例如,将域名映射到不同的服务器:

```nginx
map $host $backend {
default backend1.example.com;
example.com backend2.example.com;
}

server {
listen 80;
server_name example.com;

location / {
    proxy_pass http://$backend;
}

}
```

  1. Rewrite with Proxy Pass

Rewrite 可以与 proxy_pass 指令结合使用,实现反向代理和 URL 重写:

nginx
location /api {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://backend_server:8080;
}

五、常见应用场景

  1. 强制 HTTPS

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

  1. 去除 URL 中的 www

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

  1. 添加 www 到 URL 中

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

  1. 实现短链接

nginx
location /shortlink {
rewrite ^/shortlink/(.*)$ /longpage.html?id=$1 break;
}

  1. 清理 URL 参数

nginx
if ($args ~ ^utm_.*=.*&?){
set $args $args; # capture the arguments
rewrite ^ $uri permanent; # removes arguments
}

六、调试技巧

可以使用 rewrite_log on; 指令开启 Rewrite 日志,方便调试 Rewrite 规则。日志级别可以通过 error_log 指令设置。

七、总结

Nginx Rewrite 模块功能强大,可以实现各种 URL 操作,从简单的重定向到复杂的反向代理。掌握正则表达式和 Nginx Rewrite 指令是使用 Rewrite 模块的关键。 通过本文的学习,相信你已经对 Nginx Rewrite 有了更深入的理解,能够灵活运用它来优化你的 Web 应用。 记住,实践出真知,多尝试不同的配置和场景,才能真正掌握 Nginx Rewrite 的精髓。

THE END