Nginx的重定向规则

Nginx的重定向规则Nginx 的重定向 rewrote 规则 简单介绍 nginx 的 rewrite 功能需要 pcre 软件的支持 即要通过 perl 兼容正则表达式语句进行规则匹配的 默认参数编译的 nginx 就会支持 rewrite 的模块 但是也必须要 pcre 的支持 rewrite 是实现 url 重写的关键指令 根据 regex

大家好,我是讯享网,很高兴认识大家。

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这个网站的资源
  • ^/(.*)$:这里代表的是访问的是任何数据,输入任何的东西都行
    • 相当于是正则的内容
  • http://blog.liangjiawei.net/$1这里指定的是跳转的网站;
    • “/$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 

浏览器验证

小讯
上一篇 2025-03-30 22:24
下一篇 2025-02-19 19:24

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/65796.html