作为Web服务器领域的瑞士军刀,Nginx的URL重写功能是每个运维工程师和Web开发者必须掌握的利器。我在管理日均千万PV的电商平台时,URL重写规则曾帮助我们实现了:
rewrite模块的核心价值在于它能智能地拦截和转换请求URI,就像交通指挥员根据车牌号(请求特征)将车辆(请求)引导到正确的车道(处理逻辑)。这种机制完美解决了三大痛点:
?id=123变成/product/123实际案例:某次我们将PHP系统迁移到Java平台时,通过300多条rewrite规则实现了零死链,搜索引擎流量在迁移后不降反升15%
rewrite的完整语法格式如下:
nginx复制rewrite regex replacement [flag];
其执行过程犹如精密流水线:
$1-$9等捕获组填入replacement在配置^/archive/(d{4})/(d{2})/(d{2})$这类规则时,需要注意:
^和$严格界定起止位置,避免部分匹配导致的安全隐患(?:)非捕获模式提升性能.需转义为\.踩坑记录:曾因漏写
$导致/archive/2024/03/25evil也被匹配,引发路径穿越漏洞
| 标志位 | 适用场景 | 注意事项 |
|---|---|---|
| last | 需要继续location匹配 | 可能引发最多10次循环 |
| break | 终止当前上下文处理 | 不会改变$uri变量 |
| redirect | 临时维护跳转 | 浏览器不缓存跳转 |
| permanent | 永久性迁移 | 搜索引擎会更新索引 |
try_files的工作逻辑是:
nginx复制try_files file1 file2 ... fallback;
典型应用场景:
nginx复制location / {
try_files $uri $uri/ @backend;
}
location @backend {
proxy_pass http://tomcat;
}
这个配置实现了:
性能提示:文件检测顺序影响性能,应将高频命中项前置
电商系统常需要处理:
完整方案示例:
nginx复制server {
listen 80;
server_name ~^(www\.)?example\.com$;
# 统一小写处理
if ($host ~* [A-Z]) {
rewrite ^(.*)$ $scheme://$lowercase_host$1 permanent;
}
# HTTPS强制跳转
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
}
将RESTful API转换为传统参数:
nginx复制location ~ ^/api/([^/]+)/([^/]+) {
rewrite ^/api/([^/]+)/([^/]+) /index.php?module=$1&action=$2?args=$args;
}
根据Cookie分流流量:
nginx复制map $cookie_canary $backend {
default "production";
~^true$ "canary";
}
server {
location / {
rewrite ^/(.*)$ /$1 break;
proxy_pass http://$backend;
}
}
在http块添加:
nginx复制log_format rewrite_log '$remote_addr - $host "$request" '
'-> "$uri" after rewrite';
server {
rewrite_log on;
error_log /var/log/nginx/rewrite.log notice;
}
循环重定向:
[R=302]临时标志测试变量未生效:
$request_uri而非$uri性能瓶颈:
time curl测量单请求耗时.*替换为更精确的[^/]*^~前缀跳过正则匹配对永久重定向添加缓存头:
nginx复制location /old {
rewrite ^/old(.*)$ /new$1 permanent;
add_header Cache-Control "public, max-age=31536000";
}
使用wrk模拟重定向负载:
bash复制wrk -t4 -c100 -d60s http://test.com/old/path
监控指标重点关注:
经过这些年的实践,我认为Nginx的rewrite规则就像外科手术刀——用得好可以妙手回春,用不好则可能伤筋动骨。建议每次修改后都进行:
nginx -t最后分享一个实用技巧:在复杂的rewrite规则前添加注释说明业务背景,半年后你会感谢自己的这个决定。比如:
nginx复制# 2023年商品详情页改版迁移规则
# 旧格式:/p-123.html
# 新格式:/product/123
rewrite ^/p-([0-9]+)\.html$ /product/$1 permanent;