Nginx配置根据url参数重定向


Posted in Servers onApril 11, 2022

1. 概述

老话说的好:取乎上,得其中;取乎中,得其下。因此我们不妨把目标定的高一些,去努力,才能得到更好回报。

言归正传,今天我们来聊聊 使用 Nginx 实现 URL 的重定向。

2. 使用 Nginx 实现 URL 的重定向

2.1 使用场景

我们日常分享一个网站地址时,常常会有这样的效果,同样一个网址,在电脑的浏览器打开,是一种效果,而在手机的浏览器打开,就会展现出另一种更适合手机显示的效果。

通常要达到这样的效果,有两种方式实现:

一、使用自适应的 H5 页面实现,根据窗口宽度的大小,自动调整页面的布局。

二、使用Nginx,依据终端的不同,跳转到不同的页面,电脑打开,跳转到 PC端 使用的网页,手机打开,跳转到 手机端 使用的网页。

今天我们介绍一下第二种方式,是如何实现的。

2.2 单纯的重定向

有些 URL 的重定向,新 URL 不需要继承原 URL 的参数,例如 网站首页,这种情况,在 Nginx 配置文件的 location 中使用 return 302 的方式进行跳转即可。

location / {
        # 判断是否是移动端
        if ( $http_user_agent ~ "(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT-)|(SonyEricsson)|(NEC-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC-)|(SED-)|(EMOL-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera)" )
        {
            return 302 https://www.zhuifengren.com/h5/index.html;
        }
 
        proxy_pass http://myUpstream;
 }

2.3 依据原 URL 重定向

另一种情况就是 新 URL 需要继承原 URL 的参数,这种情况就需要使用  rewrite 对 URL 进行改写。

location / {
        # 判断是否是移动端
        if ( $http_user_agent ~ "(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT-)|(SonyEricsson)|(NEC-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC-)|(SED-)|(EMOL-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera)" )
        {
            rewrite (\w+-\w+)|(\?.*)$ https://www.zhuifengren.com/h5-$1-0.html$2 redirect;        
        }    
 
        proxy_pass http://myUpstream;
}

rewrite 的语法是: rewrite  正则表达式  改写后的URL  redirect;

其中 redirect 是 302 临时重定向的意思,也可以使用 permanent 关键字,代表 301 永久重定向。

使用 rewrite 对 URL 进行改写,需要用到 正则表达式 的知识,改写后 URL 中的 $1、$2 代表正则表达式中匹配的第一个字符串和第二个字符串,这里大家可以去了解一下正则表达式,就不细说了。

例子中的正则表达式 (\w+-\w+)|(\?.*)$,可以将原 URL:

https://www.zhuifengren.com/1001-1223.jsp?v=123456

改写为

https://www.zhuifengren.com/h5-1001-1223-0.html?v=123456

补充:Nginx根据url参数重定向

1.判断url路径

location / {
    if ($args ~* "/product-list?param1=val1&param2=val2") {
        rewrite ^ http://www.mysite.com/product-list/$arg_param1/$arg_param2? last;
    }
}

2. 判断url参数

if ($arg_path = 'abc'){
	proxy_pass http://127.0.0.1/abc/$arg_path;
}

特别注意if is evil,nginx不提供多if判断,没有or这样的判断,所以只能用下文这种方式。

location /api/ {
        if ($arg_token = '') {
        	proxy_pass http://127.0.0.1/abc
        }
        if ($http_token = '') {
             proxy_pass http://127.0.0.2/abc
        }
        if ($token = paraheader) {
        	 proxy_pass http://127.0.0.3/abc
        }
        proxy_pass http://127.0.0.1:8080/app/;
        proxy_redirect off;
    }
Servers 相关文章推荐
Nginx下配置Https证书详细过程
Apr 01 Servers
Nginx反向代理至go-fastdfs案例讲解
Aug 02 Servers
Nginx使用Lua模块实现WAF的原理解析
Sep 04 Servers
关于nginx 实现jira反向代理的问题
Sep 25 Servers
nginx实现动静分离的方法示例
Nov 07 Servers
详解nginx location指令
Jan 18 Servers
Kubernetes控制节点的部署
Apr 01 Servers
nginx容器方式反向代理实战
Apr 18 Servers
Windows server 2012 配置Telnet以及用法详解
Apr 28 Servers
Windows Server 2012 R2服务器安装与配置的完整步骤
Jul 15 Servers
教你使用RustDesk 搭建一个自己的远程桌面中继服务器
Aug 14 Servers
源码安装apache脚本部署过程详解
Sep 23 Servers
在Docker容器中部署SQL Server
Apr 11 #Servers
阿里云日志过滤器配置日志服务
阿里云k8s服务升级时502错误 springboot项目应用
Apr 09 #Servers
Consul在linux环境的集群部署
nginx.conf配置文件结构小结
docker-compose部署Yapi的方法
Apr 08 #Servers
Nginx隐藏式跳转(浏览器URL跳转后保持不变)
Apr 07 #Servers
You might like
PHP 中关于ord($str)>0x80的详细说明
2012/09/23 PHP
PHP类与对象中的private访问控制的疑问
2012/11/01 PHP
在PHP中使用redis
2013/11/04 PHP
php实现读取和写入tab分割的文件
2015/06/01 PHP
Yii实现Command任务处理的方法详解
2016/07/14 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
2019/02/08 PHP
php7性能提升的原因详解
2019/10/13 PHP
在线游戏大家来找茬II
2006/09/30 Javascript
Jquery中删除元素的实现代码
2011/12/29 Javascript
JQuery复制DOM节点的方法
2015/06/11 Javascript
js模拟淘宝网的多级选择菜单实现方法
2015/08/18 Javascript
深入理解JS实现快速排序和去重
2016/10/17 Javascript
js多个物体运动功能实例分析
2016/12/20 Javascript
用jQuery旋转插件jqueryrotate制作转盘抽奖
2017/02/10 Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
2020/10/28 Javascript
Webpack的Loader和Plugin的区别
2020/11/09 Javascript
pycharm设置注释颜色的方法
2018/05/23 Python
Python不同目录间进行模块调用的实现方法
2019/01/29 Python
记录Python脚本的运行日志的方法
2019/06/05 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
Python lambda表达式filter、map、reduce函数用法解析
2019/09/11 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
python3.7调试的实例方法
2020/07/21 Python
小结Python的反射机制
2020/09/28 Python
Html5元素及基本语法详解
2016/08/02 HTML / CSS
运动员口号
2014/06/09 职场文书
启动仪式策划方案
2014/06/14 职场文书
专业技术职务聘任证明
2015/03/02 职场文书
公司行政主管岗位职责
2015/04/09 职场文书
2016八一建军节慰问信
2015/11/30 职场文书
教学反思怎么写
2016/02/24 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书
导游词之江苏同里古镇
2019/11/18 职场文书
Django 如何实现文件上传下载
2021/04/08 Python
css display table 自适应高度、宽度问题的解决
2021/05/07 HTML / CSS
python数据分析之单因素分析线性拟合及地理编码
2022/06/25 Python