需求:研發提出一些路由跳轉需求。
解決問題:特殊狀況,業務及研發沒法快速處理的時候,須要運維快速跳轉,解決臨時問題,避免更大的bug。nginx
臨時將請求路徑/colorv1/getcolorv1 的請求轉發到 v2,且帶着問號後面的參數 :api
location ~ ^/(.)/(.)/colorv1/getcolorv1$ {
proxy_pass http://category-color-api/$1/$2/colorv2/getcolorv2?$args;
}bash
任意開頭和結尾的uri,重定向至"http://test.jenkins.com/jenkins"運維
location / { rewrite ^/(.*)$ http://test.jenkins.com/jenkins; }
location /jenkins {
proxy_pass http://127.0.0.1:8080/jenkins;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
}curl
若是訪問的URL以.sh .bash 結尾,返回狀態碼403ide
location ~ .*.(sh|bash)?$ {
return 403;
} 工具
nginx 多判斷條件語句如何實現? 好比,同時知足2個條件的請求,才轉發。
nginx的配置中不支持if條件的邏輯中包含&& 或 || 的運算 ,並且不支持if的嵌套語法;post
不然會報錯誤:nginx: [emerg] invalid condition; 對此狀況咱們能夠用變量的方式來實現。
如: 請求到/color 的訪問,請求方法是post,且refer 爲abc.com;返回200:且顯示內容{"code": 1, "msg": "發佈成功"}, 其餘不知足這兩個條件的請求,轉發到gateway;url
location ~ /color$ { set $post 0; ##定義變量 if ($request_method ~* "POST") { set $post "${post}1"; } if ($http_referer ~* "abc.com") { set $post "${post}2"; } if ($post = "012") { return 200 '{"code": 1, "msg": "發佈成功"}'; } proxy_pass http://$gateway/a-b-api$request_uri; }
禁止Scrapy等工具和UA爲空的抓取code
if ($http_user_agent ~* (Scrapy|Curl|HttpClient|^$)) { return 403; }
附:nginx配置完成以後,curl經常使用驗證方法
當咱們作了一些條件的限制,在本地curl驗證經過方可上線:
-H "referer:abc" // 設置referer
-A "okhttp/3.12.0" // 設置請求 http_user_agent
-X POST //請求方法post
-d ‘{}’ //請求參數
curl -H "referer:" -A "okhttp/3.12.0" -X POST -d '{"user": "admin", "passwd":"123456 78"}' http://test.abc.com/1/7.3/color?client=064bfc8ch477e5f6