Nginx rewrite

现在 Nginx 已经成为很多公司作为前端反向代理服务器的首选,在实际工作中往往会遇到很多跳转(重写 URL)的需求。

1.Rewrite 跳转场景

Rewrite 跳转场景主要包括以下几种:

1.可以调整用户浏览的 URL,看起来更规范,合乎开发及产品人员的需求。

2.为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。

3.网址换新域名后,让旧的访问跳转到新的域名上。

4.根据特殊变量、目录、客户端的信息进行 URL调整等。

2.Rewrite 跳转实现

Nginx 是通过 ngx_http_rewrite_module 模块支持 url 重写、支持if条件判断,但不支持 else。另外该模块需要 PCRE 支持,应在编译 Nginx 时指定 PCRE 支持,默认已经安装。根据相关变量重定向和选择不同的配置,从一个location 跳转到另一个location,不过这样的循环最多可以执行 10 次,超过后 Nginx 将返回 500 错误。

3.Rewrite 实际应用场景
在实际工作的应用中,Nginx跳转需求有三种方式可实现。可以直接用rewrite 进行匹配跳转,也可以使用if匹配全局变量后跳转。另外,还可以使用location 匹配再跳转。

4.Nginx 正则表达式

Nginx Rewrite 基本操作

Rewrite 语法

regex 表示正则匹配规则、replacement 表示跳转后的内容、flag 表示 rewrite 支持的 fag 标记。

rewritecregex><replacement>[flag]:

last:相当于 Apache 的[L]标记,表示完成 rewrite.
break:本条规则匹配完成即终止,不再匹配后面的任何规则。
redirect:返回 302 临时重定向,浏览器地址会显示跳转后的 URL 地址,爬虫不会更新url
permanent:返回 301永久重定向,浏览器地址栏会显示跳转后的 URL地址,爬虫更新 url。

Location 分类

location 大致可以分为三类

location = patt {[精准匹配]
location patt {}[一般匹配]
location ~ patt &}[正则匹配]

~:表示执行一个正则匹配,区分大小写。

~*:表示执行一个正则匹配,不区分大小

!~:表示执行一个正则匹配,区分大小写不匹配。

!~*:表示执行一个正则匹配,不区分大小写不匹配。

~:表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他 location。

=:进行普通字符精确匹配,也就是完全匹配。

@:它定义一个命名的 location,使用在内部定向时,例如 error _page,try fles。

Rewrite 常见示例

安装 Nginx 服务

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rom

yum install -y nginx

修改 Nginx 默认站点配置文件

修改/etc/nginx/conf.d/default.conf文件中如下两行

vim /etc/nginx/conf.d/default.conf

server {
listen80:
server_name www.aaa.com
#charset koi8-r;
access_log ivarloginginxww.aaa.com-access.log main;
location / {
root/usr'share/nginx/htmi;
index index. html index.htm;
}
#eror_page 4041404.himi;

 systemctl start nginx

Rewrite 示例

基于域名的跳转

vim /etcinginx/conf/ddefauit.conf

if ($shost = 'www.aaa.com')
{
rewrite “/(.")$ http:ww.newaaa.com$1 permanent;
}
systemctl reload nginx

1)域名直接跳转

按 F12 可以清楚的看到从旧域名 www.aaa.com 跳转到了新域名 www.newaaa.com 上状态码是 301 永久重定向

2)域名后面加参数跳转

因为在代码中很多请求是带参数的,所以要保证参数都能正常跳转。浏览器输入模拟访问 http:/lwww.aaa.com/test/1fndex.php(虽然这个请求内容是不存在的)跳转到http://www.newaaa.com/test/1/index.php,可以看到 301 实现了永久重定向跳转,而且域名后的参数也正常跳转

基于客户端|P访问跳转

vim /etcinginx/conf.d/default.conf

set $rewrite true;
  if ($remote addr= "192.168.6.125"){
set $rewrite false;
  if ($rewrite = true) {
     rewrite (.+)/maintenance.html;
}
   location=/maintenance.html {
      root /usr/share/nginx/html;
}
echo"Website is Maintaining,Please visit later.">/usr/share/nginx/htmlmaintenance.html
systemctlreload nginx

基于旧域名跳转到新域名后面加目录
例如现在访问的是 http:/bbsaaa

.com,现在需要将这个域名下面的发帖都跳转到http:/wnw.aaa.combbs,注意保持域名跳转后的参数不变。

vim /etc/nginx/conf.d/default.conf

server_name bbs.aaa.com;
location /post {
rewrite (.+) hitp:/iww.aaa.comibbs$1 permanent;
 systemetl reload nginx

模拟使用浏览器访问http://bbs.aaa.compost/1.php 跳转到http:/hwnw.aaa.combbs/post/1.php

  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值