Rewrite规则可以实现对url的重写,以及重定向。
nginx官方文档:/en/docs/http/ngx_http_rewrite_module.html
一、什么是重定向?
就是地址A跳转到地址B,重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)
二、为什么要进行重定向? 什么时候需要重定向?
1.网站调整(如改变网页目录结构);
2.网页被移到一个新地址;
3.网页扩展名改变(如应用需要把.php改成.html或.shtml)。
这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问
这些域名的用户自动跳转到主站点等。
三、常用的重定向方式有:
301 redirect-----永久性转移
302 redirect-----暂时性转移
这两种方式的共同点和区别:
301和302状态码都表示重定向,浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)——这是它们的共同点。
他们的不同在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。
什么时候进行301或者302跳转呢?
当一个网站或者网页24—48小时内临时移动到一个新的位置,这时候就要进行302跳转,打个比方说,我有一套房子,但是最近走亲戚去亲戚家住了,过两天我还回来的。而使用301跳转的场景就是之前的网站因为某种原因需要移除掉,然后要到新的地址访问,是永久性的,就比如你的那套房子其实是租的,现在租期到了,你又在另一个地方找到了房子,之前租的房子不住了。
使用301跳转的场景:
1)域名到期不想续费(或者发现了更适合网站的域名),想换个域名。
2)在搜索引擎的搜索结果中出现了不带www的域名,而带www的域名却没有收录,这个时候可以用301重定向来告诉搜索引擎我们目标的域名是哪一个。
3)空间服务器不稳定,换空间的时候。
使用302跳转的场景:
尽量使用301跳转!
从网址A 做一个302 重定向到网址B 时,主机服务器的隐含意思是网址A 随时有可能改主意,重新显示本身的内容或转向其他的地方。大部分的搜索引擎在大部分情况下,当收到302 重定向时,一般只要去抓取目标网址就可以了,也就是说网址B。如果搜索引擎在遇到302 转向时,百分之百的都抓取目标网址B 的话,就不用担心网址URL 劫持了。问题就在于,有的时候搜索引擎,尤其是Google,并不能总是抓取目标网址。比如说,有的时候A 网址很短,但是它做了一个302 重定向到B 网址,而B 网址是一个很长的乱七八糟的URL 网址,甚至还有可能包含一些问号之类的参数。很自然的,A 网址更加用户友好,而B 网址既难看,又不用户友好。这时Google 很有可能会仍然显示网址A。由于搜索引擎排名算法只是程序而不是人,在遇到302 重定向的时候,并不能像人一样的去准确判定哪一个网址更适当,这就造成了网址URL 劫持的可能性。也就是说,一个不道德的人在他自己的网址A 做一个302 重定向到你的网址B,出于某种原因, Google 搜索结果所显示的仍然是网址A,但是所用的网页内容却是你的网址B 上的内容,这种情况就叫做网址URL 劫持。你辛辛苦苦所写的内容就这样被别人偷走了。302 重定向所造成的网址URL 劫持现象,已经存在一段时间了。不过到目前为止,似乎也没有什么更好的解决方法。在正在进行的谷歌大爸爸数据中心转换中,302 重定向问题也是要被解决的目标之一。从一些搜索结果来看,网址劫持现象有所改善,但是并没有完全解决。
简单来说就是,从网站A(网站比较烂)上做了一个302跳转到网站B(搜索排名很靠前),这时候有时搜索引擎会使用网站B的内容,但却收录了网站A的地址,这样在不知不觉间,网站B在为网站A作贡献,网站A的排名就靠前了。
301跳转对查找引擎是一种对照驯良的跳转编制,也是查找引擎能够遭遇的跳转编制,它告诉查找引擎,这个地址弃用了,永远转向一个新地址,可以转移新域名的权重。而302重定向很容易被搜索引擎误认为是利用多个域名指向同一网站,那么你的网站就会被封掉,罪名是“利用重复的内容来干扰Google搜索结果的网站排名”。
四、nginx rewrite语法
rewrite <regex> <replacement> [flag];关键字正则 替代内容flag标记
关键字:其中关键字不能改变正则:perl兼容正则表达式语句进行规则匹配替代内容:将正则匹配的内容替换成replacementflag标记:rewrite支持的flag标记
注意:只有访问的网址匹配到正则表达式才会跳转,否则不会跳转
例子:
rewrite ^/(.*) /$1 permanent;
说明:
rewrite为固定关键字,表示开始进行rewrite匹配规则
regex部分是 ^/(.*) ,这是一个正则表达式,匹配完整的域名和后面的路径地址
replacement部分是/$1 ,$1是取自regex部分()里的内容。匹配成功后跳转到的URL。
flag部分 permanent表示永久301重定向标记,即跳转到新的 /$1 地址上
regex 常用正则表达式说明
五、rewrite(重定向)规则nginx实现
需求,当访问时,跳转到
1.编辑配置文件
[root@server1 conf]# vim nginx.conf128server {129 listen 80;130 server_name ;131 rewrite ^/(.*)$ /$1;132 133 }
rewrite ^/(.*)$ /$1;
中:$1表示用户在这里输入的内容保留,只会定向$1 前面的,也可以在后面加permanent
实现永久重定向(可以缓存,临时的不允许缓存)
https的配置可参见:/qq_35887546/article/details/104532137
之后重新加载nginx:
[root@server1 conf]# nginx -tnginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful[root@server1 conf]# nginx -s reload
2.测试:
当在客户端浏览器访问时:
六、两个域名之间的跳转
需求:访问并且以bbs结尾的,都定向到
/index.html
1.编辑配置文件
[root@server1 conf]# vim nginx.conf110server {111 listen 443 ssl;112 server_name ;#新增一个域名113 114 ssl_certificatecert.pem;115 ssl_certificate_key cert.pem;116 117 ssl_session_cache shared:SSL:1m;118 ssl_session_timeout 5m;119 120 ssl_ciphers HIGH:!aNULL:!MD5;121 ssl_prefer_server_ciphers on;122 123 #location / {124 # root /web;125 # index index.html index.htm;126 #}127 location / {128 root /bbs;129 index index.html index.htm;130 }131}132server {133 listen 80;134 server_name ;135 #rewrite ^/(.*)$ /$1;136 rewrite ^/bbs$ /index.html permanent;137 }
配置文件中rewrite ^/bbs$ /index.html permanent;
表示访问并且以bbs结尾的,都定向到
/index.html
2.编辑测试发布文件
[root@server1 conf]# mkdir /bbs[root@server1 conf]# vim /bbs/index.html[root@server1 conf]# cat /bbs/index.html
3.重新加载nginx
[root@server1 conf]# nginx -tnginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful[root@server1 conf]# nginx -s reload
4.测试
在客户端做好的解析后,在浏览器输入
/bbs
: