nginx多条件if判断后rewrite,减轻后端php工作压力(随笔)

nginx的配置文件可以看成是一个程序,一个按照程序员思维习惯进行语法设置的nginx配置程序,编写简单便于理解,而且配合着各种变量和if判断等指令可以灵活的做各种策略设置。

工作中,每当一个请求过来,都会执行一遍配置文件,配置文件的各个变量也会伴随着重新开辟一套,也就是说每个请求是相互独立的存在空间,而配置文件里的指令集的多少会根据编译模块的不同而不同,有些时候你配置一个指令,用nginx -t测试没通过,不一定是指令或语法写错,而是对应的模块没有编译进去,可以用nginx -m查看一下对应的模块。

这两天在做一个七层策略,优化访问请求,原来有大量安卓过来的302、301是通过后端php代码实现的,为了减轻后端php的工作负载,同时减少日志的输出量,想尽量把处理放到nginx这一层上。具体想法是当匹配到某个url、且ua是手机安卓时,进行一次rewrite操作,就用最基本的nginx配置文件实现,也不去用lua脚本之类的。

假设要匹配的url 是http://abc.def.com/aaa.html  ,匹配后302rewrite到http://www.hig.com ,我判断的逻辑是host=abc.def.com 并且是 request_uri=aaa.html 并且在ua中匹配到是安卓的手机设备。经过了解,安卓手机设备对应的ua的特点是同时含有android和mobile关键字,其实最后就是4层判断,这四层判断同时成立就rewrite,这四个判断条件是:

$host = "abc.def.com"
$request_uri = "aaa.html"
$http_user_agent ~* "mobile"
$http_user_agent ~* "android"

经过查询了解,nginx配置文件是不支持if嵌套、并且不支持类似shell 的 &&  和 || 的写法 ,这样就必须想别的办法解决,是的,可以变量做flag标记的方式来解决,网上也有很多例子,最后我的写法如下:

set $flag 0;

if ( $host = "abc.def.com" ){
   set $flag "1";
   }

if ( $request_uri = "/aaa.html" ){
   set $flag "${flag}1";
   }

if ( $http_user_agent ~* "mobile" ){
   set $flag "${flag}1";
   }

if ( $http_user_agent ~* "android" ){
   set $flag "${flag}1";
   }

if ( $flag = "1111" ){
   rewrite ^/(.*)$ http://www.hig.com redirect;
   }

其中注意:if指令后面要有空格,最后有几个1表示有几个判断。

时间: 2024-10-11 01:06:33

nginx多条件if判断后rewrite,减轻后端php工作压力(随笔)的相关文章

Nginx if 条件判断

Nginx if 条件判断: 1.公司网站上线有这样的需求: 由于公司网站域名从http到https的转移,在测试阶段需要公司内部进行测试,公司内部局域网访问时强制访问加密的https服务,外部用户访问正常的http服务. 第一种方法: if ( $http_x_forwarded_for ~ ^106\.38\.53\.130|210\.12\.103\.18) { return 301 https://www.xxx.cn$request_uri; } #有的说nginx不支持这种if写法,

Nginx教程(四) Location配置与ReWrite语法

1 Location语法规则 1.1 Location规则 语法规则: location [=|~|~*|^~] /uri/ {- } 首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是交给 /通用匹配.当有匹配成功时候,停止匹配,按当前匹配规则处理请求. 符号 含义 = = 开头表示精确匹配 ^~ ^~开头表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(

Nginx配置请求转发location及rewrite规则

一个示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 # 但是正则和最长字符串会优先匹配 [ configuration B ] } location /documents/ { # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索 # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条 [ c

Nginx下配置ThinkPHP的URL Rewrite模式和pathinfo模式支持

前面有关于lnmp环境的搭建,在此就不在赘述.下面就简述thinkPHP如何在nginx下开启url_rewrite和pathinfo模式支持 主要有两个步骤: 一.更改php.ini将;cgi.fix_pathinfo=0  改为cgi.fix_pathinfo=1 二.更改nginx配置文件中php的location设置pathinfo模式: location ~ \.php { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index in

Nginx(五)-- 配置文件之Rewrite

Rewrite支持URL重写 1.常用指令以及语法 1) if指令    if语法: if 空格 (condition) {}     条件:     1. “=” 来判断相等,用于字符的比较    2. “~”正则匹配(表示区分大小写) ,“~*” 不区分大小写    3. “-f|-d|-e” 判断是否为文件|目录|是否存在 2) return指令    语法: return code/uri;  停止处理并返回状态码给客户端 3) rewrite指令    语法: rewrite rege

修改nginx配置文件支持Thinkphp pathinfo以及rewrite模式

server { listen 80; server_name localhost; include /etc/nginx/default.d/*.conf; root /usr/share/nginx/thinkercms; location / { index index.php; if (!-e $request_filename) { rewrite ^/(.*)$ /index.php/$1 last; break; } } location ~ .+\.php($|/) { set

Nginx高级应用--负载均衡、rewrite规则

Nginx除了可以用作web服务器外,他还可以用来做高性能的反向代理服务器,它能提供稳定高效的负载均衡解决方案.nginx可以用轮询.IP哈希.URL哈希等方式调度后端服务器,同时也能提供健康检查功能.目前有众多公司均已经部署使用nginx实现基于七层的负载均衡功能. 一. Nginx负载均衡 为了实现Nginx的反向代理以及负载均衡功能,应用中需要用到两个模块,HttpProxyModule和HttpUpstreamModule模块:其中HttpProxyModule模块的作用是将用户的数据请

nginx 隐藏index.php 并开启rewrite日志调试

开启rewrite 日志 error_log       /data/log/nginx/error.log notice; 位于最外层,大约在文件的前几行 再在http{}括号里增加一行:rewrite_log on; 重写的日志将写入/data/log/nginx/error.log 关键代码 在http{ server{ location {#代码处} }}里写代码 location / { if ( !-e $request_filename ) { rewrite ^/(.*)$ /i

nginx+tomcat集群配置(4)--rewrite规则和多应用根目录设定思路

前言: nginx中有一块很重要的概念, 就是rewrite规则. 它会对URL进行修改, 然后进行内部的重定向. rewrite授予了nginx更多的自由, 使得后级服务的接入更加地方便. 本文将简单讲述nginx的rewrite规则和原理, 同时讲解下如何借助rewrite实现单tomcat实例/多Web App服务 对应的多域名根目录访问. 案列目标: 首先来谈一下之前对于多Web App服务对应多域名根目录访问的方案. 注: 一个域名对应一个tomcat实例, 一个tomcat实例只包含