需求
? 根據(jù)URL的參數(shù)抄罕,如果不包含關鍵字 devreg 則走地址A,并增加額外的GET參數(shù) r=interface
用例規(guī)劃
1. 訪問 http://127.0.0.1:8080/api/interface?t=1&xmlString=devreg&x=111 得到本網站的內容
2. 訪問 http://127.0.0.1:8080/api/interface?t=1&xmlString=getbin&x=111 跳轉到新地址征峦,并且新地址中可以得到參數(shù) r=interface xmlString=getbin
方案
遇到最大的問題就是 proxy_pass 必須寫在 if 里迟几,而此時 proxy_pass 只能填寫ip及端口信息,不能再添加任何額外參數(shù)栏笆。
通過搜索各類文檔类腮,使用 rewrite 和 proxy_pass 結合的方式,完成目標蛉加。貼出結果
location /api/interface {
if ( $arg_xmlString !~* '(.*devreg.*)' ) {
# proxy_pass http://127.0.0.1:8008;
rewrite ^ /api/interface2proxy_pass?r=interface;
}
}
location /api/interface2proxy_pass {
proxy_pass http://127.0.0.1:8008/eshow/index.php;
}
測試
- 參數(shù)含devreg蚜枢,則nginx 直接輸出
curl http://127.0.0.1:8080/api/interface?t=1&xmlString=devreg&x=111
- 參數(shù)不含 devreg,應該輸出 :8008服務的內容
curl http://127.0.0.1:8080/api/interface?t=1&xmlString=devr1eg&x=111
可以在8008的監(jiān)聽窗口中看到訪問內容:/eshow/index.php?r=interface&t=1&xmlString=devr1eg&x=111
額外增加的 r=interface已包含针饥,并且原始的參數(shù)都在
后記
發(fā)現(xiàn)在真實項目中(Laravel環(huán)境)厂抽,對外的可以正常轉發(fā)出去。對內的卻沒有正常到達Laravel丁眼,需要加一個try_files $uri $uri/ /laravel.php?$query_string;筷凤,直接進入Laravel環(huán)境即可。
location /api/interface {
if ( $arg_xmlString !~* '(.*devicereg.*)' ) {
rewrite ^ /api/interface2proxy_pass?r=interface;
}
try_files $uri $uri/ /laravel.php?$query_string;
}
location /api/interface2proxy_pass {
proxy_pass http://eshowcloud.com/eshow/index.php;
}
location / {
try_files $uri $uri/ /laravel.php?$query_string;
}