nginx 逻辑运算if()学习笔记

nginx的配置中不支持if条件的逻辑与&& 逻辑或|| 运算 ,而且不支持if的嵌套语法,否则会报下面的错误:nginx: [emerg] invalid condition。

我们可以用变量的方式来间接实现。

要实现的语句:

 代码如下 复制代码

if ($arg_unitid = 42012 && $uri ~/thumb/){ 
 echo "www.111cn.net"; 
}

如果按照这样来配置,就会报nginx: [emerg] invalid condition错误。

可以这么来实现,如下所示:

 代码如下 复制代码

set $flag 0; 
if ($uri ~ ^/thumb/[0-9]+_160.jpg$){ 
 set $flag "${flag}1"; 

if ($arg_unitid = 42012){ 
 set $flag "${flag}1"; 

if ($flag = "011"){ 
 echo "www.111cn.net"; 
}


例,nginx实现多重if判断

 代码如下 复制代码


# 要实现的语句
if ($remote_addr ~ "^(12.34|56.78)" && $http_user_agent ~* "spider") {
return 403;
}
# 这是等效的,并真实可用的配置
set $flag 0;
if ($remote_addr ~ "^(12.34|56.78)") {
set $flag "${flag}1";
}
if ($http_user_agent ~* "spider") {
set $flag "${flag}2";
}
if ($flag = "012") {
return 403;
}

举例

 代码如下 复制代码

if ($http_user_agent ~ MSIE) {
  rewrite  ^(.*)$  /msie/$1  break;

//如果UA包含”MSIE”,rewrite 请求到/msie目录下

if ($http_cookie ~* "id=([^;] +)(?:;|$)" ) {
  set  $id  $1;

//如果cookie匹配正则,设置变量$id等于正则引用部分

if ($request_method = POST ) {
  return 405;

//如果提交方法为POST,则返回状态405 (Method not allowed)

if (!-f $request_filename) {
  break;
  proxy_pass  http://127.0.0.1;

//如果请求文件名不存在,则反向代理localhost

if ($args ~ post=140){
  rewrite ^ http://example.com/ permanent;

//如果query string中包含”post=140″,永久重定向到example.com

你可能感兴趣的:(LINUX)