實際開發(fā)中經(jīng)常有根據(jù)請求參數(shù)來路由到不同請求處理者的情況,根據(jù)POST請求參數(shù)需要些nginx插件,這里主要簡單介紹下如何根據(jù)GET參數(shù)來路由。
1、location進行路徑
最常見的是通過location進行路徑匹配的時候,沒辦法是用正則表達一起捕獲這個路徑和querstring的。那么我想真的URL里面的Query String進行不同的rewrite,應(yīng)該如何處理呢?答案就是$arg變量。Nginx里面$query_string 與$args相同,存儲了所提交的所有$query_string;比如&p=2887&q=test如果想要在nginx里面單獨訪問這些變量。可以這樣比如$p變量可以這樣訪問 $arg_p
2、rewrite:
需求用到rewrite 其中有一個是要把a.php?id=2重定向到b-2.html開始簡單的寫為rewrite "^/a(.*)?(.*)$" /b-$2.html permanent;總是不能正確的301到b-2.html查資料發(fā)現(xiàn)
rewrite只能針對請求的uri進行重寫,/a.php問號后面的是請求參數(shù),在nginx用$query_string表示,直接寫這樣的一條重寫肯定不會正確匹配,因為rewrite參數(shù)只會匹配請求的uri,在寫重寫的時候需要把$query_string變量追加到重寫的uri后面,為了防止uri中的參數(shù)追加到重寫后的uri,可以在后面加個問號:
if ($query_string ~ "id=(.*)") { set $id $1; rewrite ^/a.php$ /b-$id.html? permanent;}【示例1】
比如我們希望訪問http://192.168.71.51:6061/do1.aspx?t=1212&c=uplog當(dāng)url中的參數(shù)c為config或uplog的時候(忽略大小寫)我們路由到其他地方:
下面是用這樣一個實例講述一下。
首先增加一個upstream:
……upstream other { server 192.168.71.41:2210; }……在location中加入判斷:
……location / { if ( $query_string ~* ^(.*)c=config/b|uplog/b(.*)$ ){ PRoxy_pass http://other; }……【示例2】要求是 如果請求中的$query_string包含"q=數(shù)字",301重新定向到首頁交由index.php處理。否則只是301重新定向到首頁。location ~* ^/wap/ {# if ( $http_user_agent ~* "(MSIE|bot|Spider|Slurp)" ) {# } if ($args ~* "p=/d+$") { rewrite ^ $scheme://$host/?p=$arg_p? permanent; } #Rewrite 后面帶一個?表示在重定向中使用query_tring rewrite ^/(.*)$ $scheme://$host/<del datetime="2012-01-24T14:18:20+00:00">?</del> permanent; }注:關(guān)于rewrite后面的問號,其作用是去除后面的qrerystring,不加?的話,就是這樣的比如原來的query_string是p=2887,不加問號的話 是重新定向到http://ihipop.info/?2887&p=2887 多了一個&p=2887這樣產(chǎn)生的 URI 不是很美觀。【示例3】
location / { if ( $query_string ~* "p=/d+$" ) { proxy_pass http://www.ifeng.com; } proxy_pass http://www.baidu.com; }通過如上配置,當(dāng)訪問nginx時,如果后面帶有p=數(shù)字的參數(shù)(http://10.153.140.42/?p=1),就會跳轉(zhuǎn)到ifeng,否則跳轉(zhuǎn)到baidu。
新聞熱點
疑難解答