一、問題描述
nginx反向代理配置一般都是配置靜態地址,比如:
server {listen 80;location / {proxy_pass http://myapp1;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}
這個反向代理表示訪問80端口跳轉到? http://myapp1 地址。
現在有需求代理的目的地址由動態傳參決定,不能配置成靜態的,傳的參數為URL,然后反向代理到URL地址。
在配置過程中,會解決跳轉后跨域問題和代理后地址自動拼接問題。
二、解決方案
1、nginx配置兩個要跳轉的地址作測試
地址一(index81.html 放在nginx/html/index81.html):
server {listen 81;server_name localhost;location / {root html;index index81.html index81.htm;}}
地址二(index82.html 放在nginx/html/index82.html):
server {listen 82;server_name localhost;location / {root html;index index82.html index82.htm;}}
2、動態代理配置
server {listen 80;server_name localhost;rewrite ^/old-url$ /new-url permanent;location /_proxy/ {# 通過正則截取路由中的 sub urlif ($request_uri ~* "/_proxy/(.*)") {set $proxy_url $1;}# 解析請求地址,并進行反向代理set $is_matched 0;if ($proxy_url ~* "^(http|ws)(s?):\/\/?([a-zA-Z0-9\-\.]+:?\d*)([^\?]*)") {set $is_matched 1;set $proxy_protocol http$2;set $proxy_host $3;set $proxy_uri $4;set $proxy_url $proxy_protocol://$proxy_host;rewrite ^ / break;proxy_pass $proxy_url;}}}
?如代碼所示,/_proxy 為代理匹配字符串,rewrite 作用有兩點:
? ? ? ? 1、防止代理后的址帶著 /_proxy 后邊的路徑。
????????2、瀏覽器的地址欄里地址不會變,還是127.0.0.1:80/....,這樣就解決了跨域問題
最后,粘貼全部代碼,包括注釋等等
server {listen 80;server_name localhost;rewrite ^/old-url$ /new-url permanent;#charset koi8-r;#access_log logs/host.access.log main;location /_proxy/ {# 被代理路徑為域名需要指定dns# resolver 114.114.114.114 valid=3600s;# 通過正則截取路由中的 sub urlif ($request_uri ~* "/_proxy/(.*)") {set $proxy_url $1;}# 解析請求地址,并進行反向代理set $is_matched 0;if ($proxy_url ~* "^(http|ws)(s?):\/\/?([a-zA-Z0-9\-\.]+:?\d*)([^\?]*)") {set $is_matched 1;set $proxy_protocol http$2;set $proxy_host $3;set $proxy_uri $4;set $proxy_url $proxy_protocol://$proxy_host;rewrite ^ / break;proxy_pass $proxy_url;}# if ($is_matched = 1) {# return 200 '{"code": 404, "message": "已經匹配到了!", "proxy_url": $proxy_url}';# }# if ($is_matched = 0) {# return 200 '{"code": 404, "message": "The proxy url is invalid!", "proxy_url": $proxy_url}';# }# Host 主機名,為了避免目標服務做限制此處采用目標地址的 Hostproxy_set_header Host $proxy_host;# X-Real-IP 將真實訪問者的遠端 IP 地址轉發給代理服務器proxy_set_header X-Real-IP $remote_addr;# X-Forwarded-For 標記客戶端通過代理連接到服務器的源 IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# X-Forwarded-Host 標記客戶端通過代理連接到服務器的原始主機proxy_set_header X-Forwarded-Host $host:$server_port;# X-Forwarded-Server 代理服務器的主機名proxy_set_header X-Forwarded-Server $host;# X-Forwarded-Port 定義客戶端請求的原始端口proxy_set_header X-Forwarded-Port $server_port;# X-Forwarded-Proto 標記客戶端通過代理連接到服務器的協議proxy_set_header X-Forwarded-Proto $scheme;# proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;}}
三、效果演示
http://127.0.0.1/_proxy/http://127.0.0.1:83
http://127.0.0.1/_proxy/http://127.0.0.1:82