nginx 如何实现if嵌套的方法示例
nginx 不支持 if 嵌套,也不允许在 if 中使用逻辑判断,会报如下错误:
nginx: [emerg] "if" directive is not allowed
当业务需要多个条件判断时,可以借助中间变量来实现
如:我们的网站在 pc 端有多个子域名, 而移动端只有一个域名,对应关系如下:
- www.test.com --> m.test.com
- sub1.test.com --> m.test.com/sub1
- sub2.test.com --> m.test.com/sub2
- sub3.test.com --> m.test.com/sub3
要实现的效果:在移动端访问 pc 域名时 301 跳转到对应的移动端域名
nginx 的重写规则如下:
# 是否为移动端 set $mobile 0; if ($http_user_agent ~* (mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)) { set $mobile 1; } # 获取子域名 set $prefix 1; if ($host ~* "sub1.test.com") { set $prefix 2; } if ($host ~* "sub2.test.com") { set $prefix 3; } if ($host ~* "sub3.test.com") { set $prefix 4; } set $sign "${mobile}${prefix}"; if ($sign = 11) { rewrite ^(.*) http://m.test.com$1 permanent; } if ($sign = 12) { rewrite ^(.*) http://m.test.com/sub1$1 permanent; } if ($sign = 13) { rewrite ^(.*) http://m.test.com/sub2$1 permanent; } if ($sign = 14) { rewrite ^(.*) http://m.test.com/sub3$1 permanent; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
相关推荐
-
Nginx中if语句的判断条件与多条件判断详解
一.if语句中的判断条件(nginx)介绍 1.正则表达式匹配: ==:等值比较; ~:与指定正则表达式模式匹配时返回"真",判断匹配与否时区分字符大小写: ~*:与指定正则表达式模式匹配时返回"真",判断匹配与否时不区分字符大小写: !~:与指定正则表达式模式不匹配时返回"真",判断匹配与否时区分字符大小写: !~*:与指定正则表达式模式不匹配时返回"真",判断匹配与否时不区分字符大小写: 2.文件及目录匹配判断: -f,
-
Nginx中IF语句实现数学比较功能
nginx的if支持=.!= 逻辑比较, 但不支持if中 <.<.>=.<= 比较. 本示例使用了set-misc-nginx-module 复制代码 代码如下: location = /test/ { default_type html; set_random $a 0 9; #$a 随机 从0-9取 if ( $a <= 4 ){ #$a 如果 < 4 这是错误的写法 echo 'a: $a is l
-
Nginx实现if多重判断配置方法示例
nginx的配置中不支持if条件的逻辑与/逻辑或运算 ,并且不支持if的嵌套语法,我们可以用变量的方式来实现: 首先是伪代码(即不被nginx支持),写在这里只是为了方便理解: 复制代码 代码如下: if ($remote_addr ~ "^(12.34|56.78)" && $http_user_agent ~* "spider") { return 403; } 下面这是等效的,并真实可用的配置 复制代码 代码如下: set $flag
-
Nginx if语句加正则表达式实现字符串截断
在给大家讲述这个问题之前,先给大家看一段nginx配置. 我们用到了 set-misc-nginx-module 复制代码 代码如下: location /test/ { default_type text/html; set_md5 $hash "secret"$remote_addr; echo $hash; } 这样输出来的内容,可能是下面这样的 复制代码 代码如下: 202cb962ac59075b964b07152d234b70 但如果我们要截取某几位
-
Nginx中IF、AND、OR语句用法实例
在上一篇文章:<Nginx if语句加正则表达式实现字符串截断>中, 我们介绍过了使用if来进行截断字符串的用法, 这次我们来了解下if的逻辑用法: 什么是逻辑用法呢, 就程序中的and.or关系, 就叫做逻辑了. NGINX支持if的 and 与 or 或者 && 与 || 吗? 答案是No. 当你尝试这样配置, 重载nginx时, nginx会报出错误 复制代码 代码如下: location = /test/ { default_type text/html
-
nginx+php出现No input file specified解决办法
今天在自己本地的开发环境突然出现了No input file specified错误,反复检查返现自己的配置文件和配置路径以及权限都没有问题.经过反复的排查终于发现了问题,现将问题及解决分享如下: 问题原因分析 在GitHub上下载了一个开源的tp5项目,之前自己本地的网站运行都没有问题.但是安装了这个开源项目后就发现本地其他网站都无法访问了.访问就是No input file specified错误.在网上也找了解决办法,但是都不是,看来这个错误有点儿诡异. 后来反复尝试,重启电脑后问题得到解
-
nginx 如何实现if嵌套的方法示例
nginx 不支持 if 嵌套,也不允许在 if 中使用逻辑判断,会报如下错误: nginx: [emerg] "if" directive is not allowed 当业务需要多个条件判断时,可以借助中间变量来实现 如:我们的网站在 pc 端有多个子域名, 而移动端只有一个域名,对应关系如下: www.test.com --> m.test.com sub1.test.com --> m.test.com/sub1 sub2.test.com --> m.tes
-
nginx配置ssl实现https的方法示例
环境说明 服务器系统:Ubuntu 18.04 64位 nginx:1.14 这篇文章主要是记录配置 https 的步骤,就不介绍申请ca证书的相关细节了 这里有免费的 ssl 证书:https://cloud.tencent.com/act/pro/ssl 我是西部数码的域名,在腾讯云申请的证书 申请证书并签发后,把证书先下载到本地 1.安装 nginx $ apt-get update // 更新软件 $ apt-get install nginx // 安装nginx 2.配置 ca 证
-
在nginx中设置三级域名的方法示例
问题描述 通过配置nginx可以设置一个IP地址下面通过不同的端口访问不同的Web应用,但是时间长了之后端口号和应用之间的关系就很模糊了. 如 http://120.79.79.XX:9001 和foreign.XXX.xin 虽然这两个网址都是指向同一个网站,但是后者显然望文生义,比前者好很多.同时在网站SEO中,后者也比前者的权重更高. 基本知识 顶级域名:.com .cn 二级域名:baidu.com sina.com ,这其中baidu 和sina就是二级域名 三级域名:zhidao.b
-
Nginx rewrite正则匹配重写的方法示例
Nginx的rewrite功能支持正则匹配重写,即将URL地址临时或永久重新指向某个新的位置,类似于重定向.这个特性有利用当网站结构做出重大调整,如之前的网站mp3资源使用URL为www.site1.org/mp3进行访问,而现在服务器上mp3目录已经被使用music目录替换,那rewrite这个功能则能够轻松实现.其次如可以将site1.org强制调整到www.site1.org,反之亦可.这个指令位于ngx_http_rewrite_module模块.本文主要描述这个指令的用法并给出演示.
-
使用Nginx反向代理到go-fastdfs的方法示例
背景 go-fastdfs是支持http协议的一款分布式文件系统,在一般的项目中,很少是直接将文件系统的地址暴露出来的,大多数都会通过nginx等软件进行反代过去,由于我司的业务和网络环境场景相对特殊,由公网部分(公有云)和内网部分(私有云)组成的混合云网络体系,公有云主要就是作为一个出口和入口以及运行一些审计认证等应用,对上游请求进行处理,从而减少私有云的处理次数,提升性能.那么也正是因为这样,在公网的环境下,要访问到私有云提供的服务则必须使用反向代理.同样道理,对于文件系统的访问也如此,如何
-
Nginx 重定向时获取域名的方法示例
TL;DR 如果你在处理 Nginx 重定向时要获取原请求的域名(比如 HTTP 到 HTTPS),请用 $host 而不是 $server_name . 问题和解决方案 今天碰到一个问题,服务器上一个子域名的请求重定向到另一个子域名上面去了.查了一段时间发现这个问题只有在 HTTP 到 HTTPS 跳转的时候才会发生.大概是这样: 从 HTTP 的 sub2 子域名跳转到 HTTPS 的 sub1 子域名 http://sub2.example.com/more_things -> https
-
nginx安装到指定目录的方法示例
公司需求,需要在同一台机器上装两个不同位置的 nginx.what!我之前都是直接装在 /user/local/ 下的啊, 或者 yum install nginx 装在 /etc/nginx 啊,这怎么办 经过我的一番寻找终于看到的一些靠谱的答案. ./configure \ --prefix=你想要安装的目录 \ --sbin-path=/你想要安装的目录/nginx \ --conf-path=/你想要安装的目录/nginx.conf \ --pid-path=/你想要安装的目录/ngin
-
Docker+keepalived+nginx实现主从热备的方法示例
前言 为解决单点故障,我们需要配置主从热备方案,服务器数量有限,故使用Docker模拟安装配置. 本次配置默认已经安装了Docker. 配置环境:centos7 64位 docker版本:Docker version 17.12.1-ce, build 7390fc6 1,拉取centos7镜像 docker pull centos:7 2,创建容器 docker run -it -d --name centos1 -d centos:7 3,进入容器centos1 docker exec -i
-
解决Nginx端口冲突的排查方法示例
问题描述 一个Spring + Angular前后端分离的项目,使用Nginx进行数据转发. Nginx监听端口8100,前台端口4200,后台端口8080. 像往常一样,提前配置好MySQL.配置好Redis,引入项目的Nginx配置文件,然后启动前台.后台,成功. 接下来出现了问题:前台发起的请求,只有极少数能被后台接收到,大部分都是404,随着在浏览器中的点击,控制台不断的出现404. 如果只是404,那问题就很简单,很大可能是Nginx端口转发设置错了.但它的神奇之处就在于,还有那么几次
随机推荐
- Ruby对比Python的优势和劣势
- JavaScript图片放大技术(放大镜)实现代码分享
- 详解Python中的多线程编程
- ES6解构赋值的功能与用途实例分析
- Yii使用Captcha验证码的方法
- 解析PHP正则提取或替换img标记属性
- asp中使用MSXML2.ServerXMLHTTP实现异步请求例子
- JSP教程(四)-JSP Actions的使用
- Docker 特性与原理详细介绍与解析
- 用JS在浏览器中创建下载文件
- Discuz!NT 论坛整合ASP程序论坛
- div当滚动到页面顶部的时候固定在顶部实例代码
- 深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
- c语言将字符串中的小写字母转换成大写字母
- python练习程序批量修改文件名
- 解决MySQL数据库中文模糊检索问题的方法
- jQuery编写widget的一些技巧分享
- JavaScript访问样式表代码
- win2003 R2升级提示另一个应用程序要求重新启动的解决方法
- Google推广的十二点技巧