Nginx的重定向rewrote规则
简单介绍:
nginx的rewrite功能需要pcre软件的支持,即要通过perl兼容正则表达式语句进行规则匹配的;
默认参数编译的nginx就会支持rewrite的模块、但是也必须要pcre的支持
rewrite是实现url重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记;
[root@node-130 nginx-1.17.10]# ./configure --help | grep rewrite
--without-http_rewrite_module disable ngx_http_rewrite_module
rewrite语法:
rewrite + <regex> + <replacement> + [flag];
正则 替代内容 flag标记
语法的详细讲解:
- 正则:perl兼容正则表达式语句进行规则匹配
- 替代内容:将正则匹配的内容替换成replacement
- flag标记:rewrite支持的flag标记
- last :本条规则匹配完成终止当前location的规则,继续向下匹配新的location URI规则
- break :本条规则匹配完成即终止,不再匹配后面的任何规则
- redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址,关闭服务,无法重定向。
- permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,关闭服务,依然可以重定向,清除缓存失效。
举例说明参数
[root@node-130 nginx]# vim /data/nginx/conf/vhost/www.liangjiawei.net.conf
server {
listen 80;
server_name www.liangjiawei.net;
location / {
root /data/html/www/;
index index.html index.htm;
rewrite ^/(.*)$ http://blog.liangjiawei.net/$1 permanent;
}
}
rewrite规则实验
实现域名跳转的实验
- 意思就是你本来访问www.liangjiawei.net的网站
- 然后跳转到blog.liangjiawei.net的网站
方案一:
www.liangjiawei.net的rewrite规则解释说明
- 在这个配置文件中,指的是www.liangjiawei.net这个网站的资源
- ^/(.*)$:这里代表的是访问的是任何数据,输入任何的东西都行
- 相当于是正则的内容
- “/$1”:这里代表的就是跟上网站的资源路径输入的
- 比如说是blog.liangjiawei.net/img/–>资源
- permanent:这是就相当于是flag标记
- 是永久的重定向,代码是301
#编写nginx的配置文件
#从之前的虚拟主机上编写这个rewrite规则
[root@node-130 nginx]# vim /data/nginx/conf/vhost/www.liangjiawei.net.conf
server {
listen 80;
server_name www.liangjiawei.net;
location / {
root /data/html/www/;
index index.html index.htm;
rewrite ^/(.*)$ http://blog.liangjiawei.net/$1 permanent;
}
}
#再来看看blog.liangjiawei.net配置文件
[root@node-130 nginx]# vim /data/nginx/conf/vhost/blog.liangjiawei.net.conf
server {
listen 80;
server_name blog.liangjiawei.net;
location / {
root /data/html/blog/;
index index.html index.htm;
}
}
#重载配置文件校验
[root@node-130 nginx]# nginx -s reload
#如果使用命令行,需要加上-I参数
[root@node-130 nginx]# curl www.liangjiawei.net -I
HTTP/1.1 301 Moved Permanently
Server: nginx/1.17.10
Date: Mon, 21 Jun 2021 08:47:11 GMT
Content-Type: text/html
Content-Length: 170
Connection: keep-alive
Location: http://blog.liangjiawei.net/
浏览器验证:跳转成功
方案二实验
修改www.liangjiawei.net的nginx配置文件
- 需要用到return 规则
- 指定的状态码就是302
- 然后再指定了blog的网站
- $request_uri;这个就是用户请求的资源
#修改配置文件
[root@node-130 nginx]# vim /data/nginx/conf/vhost/www.liangjiawei.net.conf
server {
listen 80;
server_name www.liangjiawei.net;
location / {
root /data/html/www/;
index index.html index.htm;
return 302 http://blog.liangjiawei.net/$request_uri;
}
}
#blog.liangjiawei.net的配置文件不变
#再来看看blog.liangjiawei.net配置文件
[root@node-130 nginx]# vim /data/nginx/conf/vhost/blog.liangjiawei.net.conf
server {
listen 80;
server_name blog.liangjiawei.net;
location / {
root /data/html/blog/;
index index.html index.htm;
}
}
#重载配置文件校验
[root@node-130 nginx]# nginx -s reload
#如果使用命令行,需要加上-I参数
[root@node-130 nginx]# curl -I www.liangjiawei.net
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.17.10
Date: Mon, 21 Jun 2021 08:54:06 GMT
Content-Type: text/html
Content-Length: 146
Connection: keep-alive
Location: http://blog.liangjiawei.net//
浏览器访问–>
方法三:
- 这里是使用了一个if的判断语句
- if () :意思是判断括号里面的内容
- $host != ‘www.liangjiawei.net’ :这里的意思就是如果请求的地址不是www.liangjiawei.net这个网址
- !=:代表的是逻辑非的概念;
- $host = ‘www.liangjiawei.net’ 这个代表匹配到了之后执行以下操作;
- 指定的动作就是rewrite的规则;
#修改www.liangjiawei.net的nginx配置文件
[root@node-130 nginx]# !vim
vim /data/nginx/conf/vhost/www.liangjiawei.net.conf
server {
listen 80;
server_name www.liangjiawei.net;
if ( $host = 'www.liangjiawei.net' ) {
rewrite ^/(.*)$ http://blog.liangjiawei.net/$1 permanent;
}
location / {
root /data/html/www/;
index index.html index.htm;
}
}
#blog.liangjiawei.net的配置文件不变
#再来看看blog.liangjiawei.net配置文件
[root@node-130 nginx]# vim /data/nginx/conf/vhost/blog.liangjiawei.net.conf
server {
listen 80;
server_name blog.liangjiawei.net;
location / {
root /data/html/blog/;
index index.html index.htm;
}
}
#重载配置文件校验
[root@node-130 nginx]# nginx -s reload
#如果使用命令行,需要加上-I参数
[root@node-130 nginx]# curl -I www.liangjiawei.net
HTTP/1.1 301 Moved Permanently
Server: nginx/1.17.10
Date: Mon, 21 Jun 2021 09:02:49 GMT
Content-Type: text/html
Content-Length: 170
Connection: keep-alive
Location: http://blog.liangjiawei.net/
浏览器验证
方案四:
实现阿里云的跳转效果:
当访问mirrors.aliyum.com会自动跳转到developer.aliyun.com/mirror/
这里用bbs.liangjiawei.net的网站做个实验
#修改bbs.liangjiawei.net的配置文件
[root@node-130 nginx]# vim /data/nginx/conf/vhost/bbs.liangjiawei.net.conf
server {
listen 80;
server_name bbs.liangjiawei.net;
location / {
if ( $host ~* (.*)\.(.*)\.(.*) ) {
set $vhost_name $1;
}
rewrite ^~/(.*) http://blog.liangjiawei.net/$vhost_name/$1;
root /data/html/bbs/;
index index.html index.htm;
}
}
#重载配置文件
[root@node-130 nginx]# nginx -s reload
实现不同终端的跳转实验
一个网站,有些用户是用手机访问的,
- 手机访问的安排一个网站
- 电脑访问的也安排上一个网站
- 主要用的是 $http_user_agent这个来判断
这个实验就是要实现不同终端访问有不同的结果的;
#创建一个shouji.liangjiawei.net的server
[root@node-130 nginx]# vim /data/nginx/conf/vhost/shouji.liangjiawei.net.conf
server {
listen 80;
server_name shouji.liangjiawei.net;
location / {
root /data/html/shouji;
index index.html index.htm;
}
}
#创建主页文件
[root@node-130 nginx]# mkdir /data/html/shouji
[root@node-130 nginx]# echo "你访问的是手机的页面哦" > /data/html/shouji/index.html
#测试一下
[root@node1 nginx]# curl shouji.liangjiawei.net
你访问的是手机的页面哦
#修改一下bbs的配置文件
[root@node-130 nginx]# vim /data/nginx/conf/vhost/bbs.liangjiawei.net.conf
server {
listen 80;
server_name bbs.liangjiawei.net;
location / {
root /data/html/bbs/;
index index.html index.htm;
if ( $http_user_agent ~* "iphone|android" ) { #这里主要用于判断用户的浏览器
rewrite ^/(.*)$ http://shouji.liangjiawei.net/$1;
}
}
}
#重载nginx配置文件
[root@node-130 nginx]# nginx -s reload
正常浏览器访问
- 访问到的是bbs的主页
如果选用手机
- 浏览器
- 按F12–>调出–>选择network–>ctrl+shift+M–》选择语言
实现不同浏览器的语言跳转实验
- nginx会根据不同的浏览器语言来判断给用户提供什么资源
- 主要涉及的是**$http_accept_language**
#修改bbs.liangjiawei.net的配置文件
[root@node-130 nginx]# vim /data/nginx/conf/vhost/bbs.liangjiawei.net.conf
server {
listen 80;
server_name bbs.liangjiawei.net;
location / {
if ( $http_accept_language ~ "^zh-CN" ) {
rewrite ^/(.*) /zh/$1;
}
if ( $http_accept_language ~ "^en" ) {
rewrite ^/(.*) /en/$1;
}
root /data/html/bbs;
index index.html index.htm;
}
location ^~ /zh/ {
root /data/html/bbs/;
index index.html index.htm;
}
location ^~ /en/ {
root /data/html/bbs/;
index index.html index.htm;
}
}
#准备中文和英文的内容文件
[root@node-130 nginx]# mkdir -p /data/html/bbs/{zh,en}
[root@node-130 nginx]# echo "这是中文的页面" > /data/html/bbs/zh/index.html
[root@node-130 nginx]# echo "this is enenenenen " > /data/html/bbs/en/index.html
#重载配置文件验证
[root@node-130 nginx]# nginx -s reload
错误页面跳转会首页
- 有些浏览器会直接劫持,然后跳转到它的页面
- 这里需要注意一个状态码;200
- 如果资源没有找到直接返回首页
#修改blog.liangjiawei.net的配置文件
[root@node-130 nginx]# vim /data/nginx/conf/vhost/blog.liangjiawei.net.conf
server {
listen 80;
server_name blog.liangjiawei.net;
location / {
root /data/html/blog/;
index index.html index.htm;
}
error_page 404 http://blog.liangjiawei.net/index.html;#添加这一行
}
#重载配置文件后验证
[root@node-130 nginx]# nginx -s reload
浏览器验证