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:
- set $test '';
- if ( $request_uri ~* /img/test.php ) {
- set $test P;
- }
- if ( $http_x_forwarded_for !~* ^222\.222\.222\.222.* ) {
- set $test "${test}C";
- }
- if ( $test = PC ) { #當條件符合 訪問test.php並且 ip不是222.222.222.222的 轉發到55555.php
- rewrite ^(.*)$ /img/55555.php permanent;
- }
本文出自 “yooma技術博客” 博客,請務必保留此出處http://yooma.blog.51cto.com/6965726/1187067
http://i.cnblogs.com/EditArticles.aspx?opt=1
寫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