Nginx地址重写(rewrite)配置规则

UrlRewrite并非Nginx容器独有,访问地址重写一般多用于实现伪静态,实现对用户访问的URL进行重写,以达到访问地址美观、不暴露访问参数的目的,再配合应用程序可以实现很多特殊的场景

所属分类 运维

相关标签 伪静态重写Nginx

关于rewrite

rewrite的一般多用于实现RUL地址的重定向。

Nginx的rewrite通过perl兼容正则表达式语句进行规则匹配的。

默认配置下,Nginx会支持rewrite的模块。

通过下方案例便能轻松理解rewrite的作用。

# 原本访问文章的URL
http://www.mebugs.com/post.php?url=java
# URL太不美观、暴露了我的后端请求地址、暴露了请求参数
# 通过rewrite可以实现如下地址访问,等同于上方地址
http://www.mebugs.com/post_java.html
# 配置规则
# 访问post_开头.html结果地址,重写到post.php?url=中间匹配的字符
rewrite ^/post_(.*).html$  /post.php?url=$1  break;

理解作用后,我们可以看下rewrite的语法。

rewrite的语法

rewrite的语法很简单,分为四部分。

#关键字      正则           替代内容               标记
rewrite    <regex>    <replacement>    [flag];
  • 关键字:关键字不能改变
  • 正则:perl兼容正则表达式语句进行规则匹配
  • 替代内容:将正则匹配的内容替换成replacement
  • 标记:rewrite支持的flag标记

关于正则的规则不需要多说,这一段内容主要用于匹配访问的URL。

rewrite中常见的正则规则:

  • :标记后续字符串为特殊字符串或原义字符或一个向后引用,如“ ”匹配一个换行符,而“$”则匹配“$”
  • ^:匹配起始位置
  • $:匹配结束位置
  • .:匹配任何单个字符
  • *:匹配前面的字符零次或多次,如x*能匹配x、xx、xxx,.*则表示通配
  • +:匹配前面的字符一次或多次
  • ?:匹配前面的字符零次或一次,"?"等效于"{0,1}"
  • (pattern):非常重要!!!匹配括号内pattern并可以在后面获取对应的匹配,常用$1...$9属性获取小括号中的匹配内容

rewrite中的正则还受其所在的location影响,因为外部location也是可以正则的。

注意:rewrite可以不配置在location下表示全局生效

# 基本规则(所有的URL都会接受rewrite)
location / {
    rewrite ^/post_(.*).html$  /post.php?url=$1  break;
}
# location有规则(只有URL以.html结尾的请求才会进来)
location ~ .*.(html)?$ {
    rewrite ^/post_(.*).html$  /post.php?url=$1  break;
}
# 这是一个错误的规则(不会生效)
# 外部定义了只有/open开始的URL进来,内部定义了匹配/post,所以规则不会生效
location /open {
    rewrite ^/post_(.*).html$  /post.php?url=$1  break;
}

替代内容实际上就是将前面匹配到的URL转换成实际URL。

需要注意的是,里面是可以接受参数的,接受的内容为正则中圆括号包裹的内容。

# 还是上文的例子
# $1取得是前面规则中(.*)匹配的字符串,比如:/post_java.html时$1就是java
rewrite ^/post_(.*).html$  /post.php?url=$1  break;
# 多参数的写法
# /page_new_1_.html => /page.php?type=new&current=1
rewrite ^/page_([a-z]+)_(d+)_.html$  /page.php?type=$1&current=$2  break;

这是一个可选项,不写默认似乎是last。

  • last:本条规则匹配完成后,继续向下匹配新的location URI规则
  • break:本条规则匹配完成即终止,不再匹配后面的任何规则
  • redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址
  • permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

我们看到redirect和permanent会发生重定向。

而last和break用来实现URL重写,浏览器地址栏URL地址不变

其他注意点

正则中如果只是匹配但不需要传参,则无需用圆括号包裹。

rewrite ^/c_[0-9]+/(.*)$ /comm/$1 break;
# 上方规则仅仅对第二部分进行传参匹配
# 比如:/c_1/go =>/comm/go  /c_1/xx/mo =>/comm/xx/mo

rewrite不一定需要完全在配置文件中配置,可以单独引入。

# REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
include /www/server/rewrite/mebugs.conf;
# REWRITE-END
# 配置文件不一定要.conf,.htaccess 也是可以的

配置rewrite规则时可以引入一些Nginx的全局变量,甚至增加if条件判断,可以实现更为复杂的规则配置。

# 如果访问的是mebugs.com的任意子域名才生效如下规则
if ($host ~* (.*)/.mebugs/.com) {
    rewrite ^/page_([a-z]+)_(d+)_.html$  /page.php?type=$1&current=$2 last;
}
# 特定子域名访问子目录
if ($http_host ~ me/.mebugs/.com$) {
rewrite ^(.*) /me/$1 break;
}

米虫

做一个有理想的米虫,伪全栈程序猿,乐观主义者,坚信一切都是最好的安排!

本站由个人原创、收集或整理,如涉及侵权请联系删除

本站内容支持转发,希望贵方携带转载信息和原文链接

本站具有时效性,不提供有效、可用和准确等相关保证

本站不提供免费技术支持,暂不推荐您使用案例商业化

选择个人头像

昵称

邮箱

QQ

网址

评论提示

  • 头像:系统为您提供了12个头像自由选择,初次打开随机为你选择一个
  • 邮箱:可选提交邮箱,该信息不会外泄,或将上线管理员回复邮件通知
  • 网址:可选提交网址,评论区该地址将以外链的形式展示在您的昵称上
  • 记忆:浏览器将记忆您已选择或填写过得信息,下次评论无需重复输入
  • 审核:提供一个和谐友善的评论环境,本站所有评论需要经过人工审核