使用rewrite规则实现将所有到a域名的访问rewrite到b域名
Posted 一夜入秋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用rewrite规则实现将所有到a域名的访问rewrite到b域名相关的知识,希望对你有一定的参考价值。
rewrite 指令
rewrite是通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,是按照顺序依次对URI进行匹配,rewrite主要是针对用户的请求的URL和URI来做具体的处理的。
nginx的rewrite的官方文档:https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite
语法格式:
Syntax: rewrite regex replacement [flag];
Default: —
Context: server, location, if
正则表达式格式:
. #匹配除换行符以外的任意字符
\\w #匹配字母或数字或下划线或汉字
\\s #匹配任意的空白符
\\d #匹配数字
\\b #匹配单词的开始或结束
^ #匹配字付串的开始
$ #匹配字符串的结束
* #匹配重复零次或更多次
+ #匹配重复一次或更多次
? #匹配重复零次或一次
(n) #匹配重复n次
n, #匹配重复n次或更多次
n,m #匹配重复n到m次
*? #匹配重复任意次,但尽可能少重复
+? #匹配重复1次或更多次,但尽可能少重复
?? #匹配重复0次或1次,但尽可能少重复
n,m? #匹配重复n到m次,但尽可能少重复
n,? #匹配重复n次以上,但尽可能少重复
\\W #匹配任意不是字母,数字,下划线,汉字的字符
\\S #匹配任意不是空白符的字符
\\D #匹配任意非数字的字符
\\B #匹配不是单词开头或结束的位置
[^x] #匹配除了x以外的任意字符
[^devops] #匹配除了devops这几个字母以外的任意字符
rewrite flag的使用
利用nginx的rewrite的指令,可以实现url的重新跳转,rewrite有四种不同的flag,分别是redirect(临时重定向302)、permanent(永久重定向301)、break和last。其中前两种是跳转型flag,后两种是代理型
- 跳转型指由客户端浏览器重新对新地址进行请求
- 代理型是在WEB服务器内部实现跳转
flag 说明
redirect;
#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302
permanent;
#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求,状态码:301
break;
#重写完成后,停止对当前URL在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location中使用
#适用于一个URL一次重写
last;
#重写完成后,停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查,不建议在location中使用
#适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户
301永久重定向
- 域名永久型调整,即域名永远跳转至另外一个新的域名,之前的域名再也不使用,跳转记录可以缓存到客户端浏览器
- 永久重定向会缓存DNS解析记录, 浏览器中有 from disk cache 信息,即使nginx服务器无法访问,浏览器也会利用缓存进行重定向
实例:实现域名的永久重定向
#准备好以下两个nginx配置文件和两个页面文件
root@Nginx:~# vim /apps/nginx/conf.d/pc.conf
server
listen 80;
server_name www.zhanggui.com;
location /
root /data/nginx/html/pc;
index index.html index.hml;
rewrite / http://www.zhanggui.org redirect;
root@Nginx:~# vim /apps/nginx/conf.d/mobile.conf
server
listen 80;
server_name m.zhanggui.com;
location /
root /data/nginx/html/mobile;
index index.html index.htm;
root@Nginx:~# cat /data/nginx/html/pc/index.html
pc website
root@Nginx:~# cat /data/nginx/html/mobile/index.html
mobile website
#配置完后重新加载以下nginx配置文件
root@Nginx:~# nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
root@Nginx:~# nginx -s reload
#在测试访问一下是否重定向成功
[root@Centos8 ~]#curl www.zhanggui.com -ikL
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Sat, 23 Apr 2022 12:17:06 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Location: http://m.zhanggui.com
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 23 Apr 2022 12:17:06 GMT
Content-Type: text/html
Content-Length: 15
Last-Modified: Fri, 15 Apr 2022 11:17:02 GMT
Connection: keep-alive
ETag: "6259542e-f"
Accept-Ranges: bytes
mobile website
用宿主机访问一下查看是否会有缓存
302临时重定向
- 域名临时重定向,告诉浏览器域名不是固定重定向到当前目标域名,后期可能随时会更改,因此浏览器不会缓存当前域名的解析记录,而浏览器会缓存永久重定向的DNS解析记录,这也是临时重定向与永久重定向最大的本质区别。
实例:实现域名的临时重定向
root@Nginx:~# vim /apps/nginx/conf.d/pc.conf
server
listen 80;
server_name www.zhanggui.com;
location /
root /data/nginx/html/pc;
index index.html index.hml;
rewrite / http://www.zhanggui.org permanent;
root@Nginx:~# vim /apps/nginx/conf.d/mobile.conf
server
listen 80;
server_name m.zhanggui.com;
location /
root /data/nginx/html/mobile;
index index.html index.htm;
root@Nginx:~# cat /data/nginx/html/pc/index.html
pc website
root@Nginx:~# cat /data/nginx/html/mobile/index.html
mobile website
#配置完后重新加载以下nginx配置文件
root@Nginx:~# nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
root@Nginx:~# nginx -s reload
#在测试访问一下是否重定向成功
[root@Centos8 ~]#curl www.zhanggui.com -ikL
HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Sat, 23 Apr 2022 12:27:42 GMT
Content-Type: text/html
Content-Length: 138
Connection: keep-alive
Location: http://m.zhanggui.com
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 23 Apr 2022 12:27:42 GMT
Content-Type: text/html
Content-Length: 15
Last-Modified: Fri, 15 Apr 2022 11:17:02 GMT
Connection: keep-alive
ETag: "6259542e-f"
Accept-Ranges: bytes
mobile website
以上是关于使用rewrite规则实现将所有到a域名的访问rewrite到b域名的主要内容,如果未能解决你的问题,请参考以下文章
Nginx实践:用rewrite规则实现域名重定向及客户端IP地址透传