ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# rewrite重写模块 [TOC] ## 一、 说明 rewrite地址可以实现地址重写,简单的用法就是伪静态网页,Nginx的rewrite规则需要pcre软件的支持,即通过Perl兼职正则表达式对语法进行规则匹配 ### 1. rewrite语法 ```sh rewrite regex replacement [flag] ``` 解释:rewrite指令匹配regex处的正则表达式,匹配成功后跳转到replacement处的网页,最后flag是标记 ``` rewrite ^/(.*) http://www.etiantian.org/$1 permanent ``` 解释:此处的正则表达式表示匹配所有,匹配成功后跳转到etiantian.org这个网页上。$1是后向引用正则表达式括号里面的内容,并用permanent做标记为永久301重定向 ### 2. regex常用正则表达式 ```sh \ 将后面的字符标记为一个特殊字符、原意字符、后向引用 如\n匹配换行符,\$匹配$ ^ 匹配输入字符串的起始位置 $ 匹配输入字符串的结束位置 * 匹配前面的字符零次或多次 + 匹配前面的字符一次或多次 ? 匹配前面的字符零次或一次 . 匹配除\n之外的任何单个字符 (pattern) 匹配括号内的表达式,常用来做后向引用 ``` ### 3. rewrite指令flag标记说明 ```sh last 本条规则匹配完成后,继续向下匹配新的location URI规则。 break 本条规则匹配完成后终止,不再向后匹配规则。 redirect 返回302临时重定向。 permanent 返回301永久重定向。 ``` **说明:** 1. last和break实现url重写,浏览器显示的地址不变,服务器端访问的程序和路径发生了变化 2. redirect和permanent实现url跳转,浏览器显示的地址是跳转后的地址 3. 使用别名alias时,要使用last标记,。 4. 使用proxy_pass时,要使用break标记 5. 在根location(即location/{......})中或server{......}标签中,编写rewrite规则,建议使用last标记 6. 在普通的loaction(如location/oldboy/{......}或if{ })中编写rewrite规则,则建议使用break标记 ### 4. rewirt在企业中的应用场景 1)可以跳转用户浏览的url,使其看起来更规范,符合开发及产品人员的需求 2)为了让搜索引擎搜录网站的内容,将动态url地址伪装成静态地址 3)网站换新域名后,将旧域名的访问跳转到新域名上 4)根据特殊变量、目录、客户端的信息进行url跳转 ## 二、 企业案例 ### **1. 需求** 要求访etiantian.org时,跳转到`www.etiantian.org ` ### 2. 错误配置[很常见] 1) 配置 ```sh [root@xxx ~]# cat bbs.conf server { listen 80; server_name www.etiantian.org bbs.org; rewrite ^/(.*) http://www.etiantian.org/$1 permanent; root html/bbs; index index.html index.htm; } ``` 访问测试 ```sh [root@xxx ~]# curl -L etiantian.org curl: (47) Maximum (50) redirects followed ``` 显示最多跳转50次,已经跳转了47次,放弃跳转 说明进入了无限循环状态 2) 错误原因 ```sh [root@xxx ~]# curl -Lv etiantian.org #显示循环过程,显示内容略,可以从显示内容中,看出无限循环 ``` **原因分析:** 第一次访问etiantia.org后,并要求跳转至www.etiantian.org 第二次用www.etiantian.org访问,不管前面是什么域名,再次匹配跳转规则,被要求再次跳转,所以进入了无限循环 ### 3. 正确配置 1) 方法1:使用2个虚拟服务器 ```sh [root@xxx ~]# cat www.conf server { listen 80; server_name etiantian.omg; rewrite ^/(.*) www.etiantian.omg/$1 permanent; } server { listen 80; server_name www.etiantian.omg; location / { root html/www; index index.html index.htm; } ``` 输入etiantian.omg网址后,会永久重定向到www.etiantian.omg网址,且地址栏显示跳转后的地址 2) 方法2:用if语句判断后,再进行地址重写 ``` [root@xxx ~]# cat bbs.conf server { listen 80; server_name bbs.etiantian.org bbs.org; if ($host ~* "^etiantian.org$") { rewrite ^/(.*) http://bbs.etiantian.org/$1 permanent; } root html/bbs; index index.html index.htm; } ```