首页 > 系统相关 >nginx通过set变量来实现if语句的AND判断;

nginx通过set变量来实现if语句的AND判断;

时间:2022-12-23 14:35:16浏览次数:58  
标签:语句 set http request nginx test iftmp php

http://www.doself.com/?post=105

今天在配置一个网站的rewrite规则时碰到了这个问题。

在Nginx里不能够采用这样的语句

 

1 if ($request_method = POST && $http_cookie ~* "CCCC=.+(?:;|$)")

在Nginx里貌似if语句里也不能再嵌套if语句,怎么办呢?

 

可以这样

 

 

01 if ($request_method = POST) {
02     set $test  P;
03   }
04   
05   if ($http_cookie ~* "CCCC=.+(?:;|$)" ) {
06     set $test  "${test}C";
07   }
08   
09   if ($test = PC) {
10     #rewrite rule goes here.
11   }

ok,试试吧!

 

=========================

http://yooma.blog.51cto.com/6965726/1187067

 2、访问某个php应用的时候我只想让内部的某个IP访问,其他的IP都转到另一个PHP上。如下:
访问test.php,且IP不等222.222.222.222的跳转到55555.php:

  1. set $test '';
  2. if ( $request_uri ~* /img/test.php ) {
  3.         set $test P;
  4. }
  5. if ( $http_x_forwarded_for !~* ^222\.222\.222\.222.* ) {
  6.         set $test "${test}C";
  7. }
  8. if ( $test = PC ) {  #当条件符合 访问test.php并且 ip不是222.222.222.222的 转发到55555.php
  9. rewrite ^(.*)$ /img/55555.php permanent;  
  10. }

本文出自 “yooma技术博客” 博客,请务必保留此出处http://yooma.blog.51cto.com/6965726/1187067

 

http://i.cnblogs.com/EditArticles.aspx?opt=1

If    ($request_method    ~*   "POST")                                 {                                                set    $test  o;                                   }      if    ($remote_addr      =     '188.188.3.171')        //如果访问地址等于188.188.3.171则返回“k” 同理 #if  ($remote_addr    !=   '188.188.3.171')        //如果访问地址非188.188.3.171则返回“k”                                   {                                                Set    $test    "${test}k";                                 }   //如果满足上述条件则返回“ok”处理方式为返回403   if    (  $test    =    ok  )                                 {                                                Return    403;                                                         #rewrite    ^(.*)   http://www.fengyuba.com  permanent;                                                         #如果满足条件则重定向到www.fengyuba.com                                 }     http://blog.jiajieit.net/nginx-achieve-if-multiple-judgments-wording/  
写Nginx.conf的朋友也会经常用到if判断,这里的格式跟php里的有点不同。以下是多重if判断的书写格式方法。特意转回来给路过的朋友看看,顺便做个归档已备用日后参考。自己从中理解使用方法吧。有一点基础的都应该看得懂的。

使用nginx的朋友可能都知道nginx的if语法比较严格,并且还没and && || 这类写法,如果你想多重判断我们就只能想其它办法了,下面我来给大介绍一种投机倒把另外想办法实现多重判断,方法介绍有需要了解的朋友可参考。

[code lang="xml" title="代码片段一"]
if ($request_uri ~ "xxx.php?xxx") {
set $iftmp Y;
}
if ($http_user_agent ~ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1)") {
set $iftmp "${iftmp}Y";
}
if ($iftmp = YY) { return 400;}
location / {
proxy_pass https://172.0.0.11;
}

重点一 set $iftmp Y 将iftmp设置为Y,set命令是一个大大的亮点

重点二 还是set部分set $iftmp "${iftmp}Y" 在set里面 ${iftmp}Y将参数叠加一次,${iftmp}是一个大大的亮点.

$request_uri是客户端请求的完整请求路径,$http_user_agent是用户端发出请求的浏览器参数.
上面的if判断是一个简单防cc攻击的原型,一般普通的cc攻击会固定攻击页面,然后浏览器参数也大多不变,当前两个if参数同时满足后第三个if就直接返回给请求端400错误,
这样就完成了一次简单的过滤cc攻击请求到正常页面,根据上面的实例可以依葫芦画瓢进行其他一些应用使用.

假设我们需要对 /admin/ 路径进行rewrite,但同时要排除 /admin/images/ 路径不对该路径进行rewrite,可以采用下面的解决办法:

[code lang="xml" title="代码片段二"]
set $doRewrite "0";
if ($request_uri ~ ^/admin/) {
set $doRewrite "1";
if ($request_uri ~ ^/admin/images/) {
set $doRewrite "0";
}
if ($doRewrite = "1") {
// do rewrite
}

本例子也有别的不用set变量的方法来实现。本文仅仅给大家提供一个思路,希望大家能抛砖引玉的应用到实际需求当中。

本文纯属转载,本文转自:http://www.111cn.net/sys/nginx/46311.htm

标签:语句,set,http,request,nginx,test,iftmp,php
From: https://www.cnblogs.com/gaoyanbing/p/17000600.html

相关文章

  • Nginx配置时的参数及作用
    $args#请求中的参数值$query_string#同$args$arg_NAME   #GET请......
  • 高性能web服务器nginx和反向代理
    高性能web服务器——nginx一、 简介1. nginx是什么?l 是一个使用c语言开发的高性能的http服务器和反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。l 是俄罗斯的程序设......
  • 手写 Promise.all/race/allSettled/any
    //有一个失败则返回失败的结果,全部成功返回全成功的数组Promise.all=function(promiseList=[]){returnnewPromise((resolve,reject)=>{constresult......
  • sql语句出现group by分组之后查询其他非分组字段的方式
    如题,当sql中出现groupby时这时其他非分组字段只能带函数才能出现在select列中,所以最好的办法只能连表去查询其他字段 @Select("<script>"+"select......
  • Nginx 重定向
    301重定向location/{return301https://$host$request_uri;}禁止ip地址访问server{listen80default_server;return500;......
  • Nginx反向代理
    1、何为反向代理在介绍反向代理之前,先来了解一下正向代理。正向代理:如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理......
  • docker的dockerfile案例nginx学习
    一、什么是DockerfileDockerfile是自动构建docker镜像的配置文件,将镜像构建过程通过指令的方式定义在Dockerfile中。配合​​dockerbuild​​命令行可以实现自动化的Docker......
  • 神器 Nginx 的学习手册 ( 建议收藏 )
    Nginx是一个高性能的HTTP和反向代理服务器,特点是占用内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页服务器中表现较好。Nginx专为性能优化而开发,性能是......
  • C++学习---cstdio的源码学习分析10-改变文件流文件流buffer函数setvbuf
    cstdio中的文件访问函数stdio.h中定义了一系列文件访问函数(fopen,fclose,fflush,freopen,setbuf,setvbuf),接下来我们一起来分析一下setvbuf对应的源码实现。-fopen:打开文件-......
  • 【CF1463F】Max Correct Set(结论)
    题意:给定\(n\),求最大的\(|S|\)使得\(S\subseteq\{1,\cdots,n\}\)且对于任意\(a,b\inS\)有\(|a-b|\neqx\)且\(|a-b|\neqy\)。\(n\leq10^9\),\(x,y\leq22\)......