HoRain云--Nginx的正则表达式
我之前在配置一个电商网站时,用正则表达式实现了"商品ID"的URL美化,从/product.php?id=123变成了/product/123,效果超赞!客户都说"这个URL看起来专业多了",而且对SEO也友好。

🎬 HoRain 云小助手:个人主页
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
目录

🌟 Nginx正则表达式:从入门到实战
嘿!最近在配置Nginx时被正则表达式搞晕了吗?别担心,我之前也这样!不过现在我可太熟悉这些"神秘符号"了,今天就来给你讲讲Nginx正则表达式,保证让你轻松掌握,再也不怕配置文件里的那些"天书"啦!😄
🔍 一、Nginx正则表达式基础
Nginx使用的是Perl兼容正则表达式(PCRE),在location指令和rewrite指令中广泛应用。正则表达式就像一把"瑞士军刀",能帮你轻松解决各种URL匹配问题。
🧩 二、核心元字符速查表
| 符号 | 说明 | 示例 | 匹配结果 |
|---|---|---|---|
^ |
匹配字符串起始位置 | ^/api |
匹配/api/login,但不匹配/user/api |
$ |
匹配字符串结束位置 | \.jpg$ |
匹配image.jpg,但不匹配image.jpg?param=1 |
. |
匹配任意单个字符(除换行符) | /u.er |
匹配/user、/u@er、/u-er等 |
* |
匹配前面字符零次或多次 | /ab*c |
匹配/ac、/abc、/abbbbc |
+ |
匹配前面字符一次或多次 | /ab+c |
匹配/abc、/abbbbc,但不匹配/ac |
? |
匹配前面字符零次或一次 | /https? |
匹配http和https |
\ |
转义字符 | \.php |
匹配真实的.php,而不是任意字符+php |
() |
捕获组 | ^/user/(\d+)$ |
提取/user/123中的123,可用$1引用 |
| ` | ` | 或运算符 | `(jpg |
\d |
匹配数字 | \d{3} |
匹配123、456等三位数字 |
📌 三、Nginx中正则表达式的使用方式
1. Location匹配中的正则
Nginx的location指令有多种匹配方式:
| 类型 | 语法 | 说明 |
|---|---|---|
| 精确匹配 | location = /path |
URI必须完全一致 |
| 前缀匹配 | location ^~ /path |
匹配前缀后停止搜索正则 |
| 区分大小写正则 | location ~ pattern |
如location ~ ^/images |
| 不区分大小写正则 | location ~* pattern |
如`location ~* .(gif |
| 普通前缀匹配 | location /path |
按最长前缀匹配 |
| 通用匹配 | location / |
兜底规则 |
2. 匹配优先级规则(从高到低)
- 精确匹配:
location = /path - 前缀匹配:
location ^~ /path - 正则匹配:
location ~ pattern(按配置顺序匹配,首次匹配成功即生效) - 普通前缀匹配:
location /path - 通用匹配:
location /
💡 举个栗子:如果同时有
location = /about和location ~ ^/about,那么/about只会匹配到精确匹配的location = /about,不会匹配到正则匹配。
🛠 四、实战案例:正则表达式在Nginx中的应用
1. 图片文件访问控制
location ~* \.(jpg|jpeg|png|gif)$ {
# 只允许特定域名引用图片
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
}
}
这个配置会阻止所有非指定域名的图片引用,保护你的图片不被盗链。
2. URL重写与美化
# 从 /index.php?id=123 转为 /article/123
rewrite ^/index\.php\?id=(\d+)$ /article/$1 permanent;
# 从 /product/123 转为 /index.php?id=123
location /product/ {
rewrite ^/product/(\d+)$ /index.php?id=$1 last;
}
3. 路径重定向
# 将所有http请求重定向到https
if ($scheme = http) {
rewrite ^(.*)$ https://$host$1 permanent;
}
4. 处理SPA应用
location / {
try_files $uri $uri/ /index.html;
}
这个配置让Nginx在找不到具体文件时,返回
index.html,支持前端路由。
⚠️ 五、性能与调试建议
1. 避免过度使用正则
- 正则匹配比前缀匹配慢,优先使用前缀匹配
- 如果可能,使用
location =或location ^~代替正则
2. 调试技巧
- 使用
nginx -t检查配置是否正确 - 在配置中添加注释,说明每个正则的用途
- 用
curl -v测试你的URL规则
3. 常见错误
错误1: rewrite ^/old/(.*)$ /new/$1 permanent; 但实际匹配不到 原因: 没有考虑/old后面可能有斜杠或参数 修复: rewrite ^/old/(.*)$ /new/$1? permanent;
错误2: location ~* \.php$ 但PHP文件无法执行 原因: 没有配置FastCGI 修复: 添加FastCGI配置
💡 六、一个小贴士
我之前在配置一个电商网站时,用正则表达式实现了"商品ID"的URL美化,从/product.php?id=123变成了/product/123,效果超赞!客户都说"这个URL看起来专业多了",而且对SEO也友好。
🌈 总结
| 用途 | 推荐正则 | 说明 |
|---|---|---|
| 图片防盗链 | `~* .(jpg | png |
| URL美化 | rewrite ^/product/(\d+)$ /index.php?id=$1 last; |
使URL更友好 |
| HTTP转HTTPS | if ($scheme = http) { rewrite ^(.*)$ https://$host$1 permanent; } |
提升安全性 |
| SPA支持 | try_files $uri $uri/ /index.html; |
支持前端路由 |
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
更多推荐




所有评论(0)