1.匹配url:https://bby.ios.xxx.com:8081/zd?sid=15&key=repx_2530 匹配到sid的值根據sid值進行代理分發
2.達到效果:請求https://bby.ios.xxx.com:8081/xxxx?sid=xxx&xxxxx 根據sid的值轉發到對應sid的后端服務
3.nginx配置示例
upstream game_1501{ server 172.17.0.16:8100; } ### server { listen 8081; server_name bby.ios.xxx.com; ssl on; ssl_certificate ssl/xxx.com.crt; ssl_certificate_key ssl/xxx.com.key; ssl_protocols SSLv2 SSLv3 TLSv1 TLSv1.2; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; access_log /var/log/nginx/distribute_battle_report_new.access.log; error_log /var/log/nginx/distribute_battle_report_new.error.log; location ~* ^/*/ { if ($args ~* "(.*)sid=(\d+)(.*)$") { set $id $2; } add_header Access-Control-Allow-Origin *; proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass https://game_$id; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } error_page 500 502 503 504 /50x.html; }
4.常用正則
1、正則表達式匹配 ~ 區分大小寫匹配 ~* 不區分大小寫匹配 !~和!~*分別為區分大小寫不匹配及不區分大小寫不匹配 ^ 以什么開頭的匹配 $ 以什么結尾的匹配 轉義字符。可以轉. * ?等 * 代表任意字符 2、文件及目錄匹配 -f和!-f用來判斷是否存在文件 -d和!-d用來判斷是否存在目錄 -e和!-e用來判斷是否存在文件或目錄 -x和!-x用來判斷文件是否可執行
5.nginx內置變量詳解
$args #請求中的參數值 $query_string #同 $args $arg_NAME #GET請求中NAME的值 $is_args #如果請求中有參數,值為"?",否則為空字符串 $uri #請求中的當前URI(不帶請求參數,參數位於$args),可以不同於瀏覽器傳遞的$request_uri的值,它可以通過內部重定向,或者使用index指令進行修改,$uri不包含主機名,如"/foo/bar.html"。 $document_uri #同 $uri $document_root #當前請求的文檔根目錄或別名 $host #優先級:HTTP請求行的主機名>"HOST"請求頭字段>符合請求的服務器名.請求中的主機頭字段,如果請求中的主機頭不可用,則為服務器處理請求的服務器名稱 $hostname #主機名 $https #如果開啟了SSL安全模式,值為"on",否則為空字符串。 $binary_remote_addr #客戶端地址的二進制形式,固定長度為4個字節 $body_bytes_sent #傳輸給客戶端的字節數,響應頭不計算在內;這個變量和Apache的mod_log_config模塊中的"%B"參數保持兼容 $bytes_sent #傳輸給客戶端的字節數 $connection #TCP連接的序列號 $connection_requests #TCP連接當前的請求數量 $content_length #"Content-Length" 請求頭字段 $content_type #"Content-Type" 請求頭字段 $cookie_name #cookie名稱 $limit_rate #用於設置響應的速度限制 $msec #當前的Unix時間戳 $nginx_version #nginx版本 $pid #工作進程的PID $pipe #如果請求來自管道通信,值為"p",否則為"." $proxy_protocol_addr #獲取代理訪問服務器的客戶端地址,如果是直接訪問,該值為空字符串 $realpath_root #當前請求的文檔根目錄或別名的真實路徑,會將所有符號連接轉換為真實路徑 $remote_addr #客戶端地址 $remote_port #客戶端端口 $remote_user #用於HTTP基礎認證服務的用戶名 $request #代表客戶端的請求地址 $request_body #客戶端的請求主體:此變量可在location中使用,將請求主體通過proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass傳遞給下一級的代理服務器 $request_body_file #將客戶端請求主體保存在臨時文件中。文件處理結束后,此文件需刪除。如果需要之一開啟此功能,需要設置client_body_in_file_only。如果將次文件傳 遞給后端的代理服務器,需要禁用request body,即設置proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off,or scgi_pass_request_body off $request_completion #如果請求成功,值為"OK",如果請求未完成或者請求不是一個范圍請求的最后一部分,則為空 $request_filename #當前連接請求的文件路徑,由root或alias指令與URI請求生成 $request_length #請求的長度 (包括請求的地址,http請求頭和請求主體) $request_method #HTTP請求方法,通常為"GET"或"POST" $request_time #處理客戶端請求使用的時間,單位為秒,精度毫秒; 從讀入客戶端的第一個字節開始,直到把最后一個字符發送給客戶端后進行日志寫入為止。 $request_uri #這個變量等於包含一些客戶端請求參數的原始URI,它無法修改,請查看$uri更改或重寫URI,不包含主機名,例如:"/cnphp/test.php?arg=freemouse" $scheme #請求使用的Web協議,"http" 或 "https" $server_addr #服務器端地址,需要注意的是:為了避免訪問linux系統內核,應將ip地址提前設置在配置文件中 $server_name #服務器名 $server_port #服務器端口 $server_protocol #服務器的HTTP版本,通常為 "HTTP/1.0" 或 "HTTP/1.1" $status #HTTP響應代碼 $time_iso8601 #服務器時間的ISO 8610格式 $time_local #服務器時間(LOG Format 格式) $cookie_NAME #客戶端請求Header頭中的cookie變量,前綴"$cookie_"加上cookie名稱的變量,該變量的值即為cookie名稱的值 $http_NAME #匹配任意請求頭字段;變量名中的后半部分NAME可以替換成任意請求頭字段,如在配置文件中需要獲取http請求頭:"Accept-Language",$http_accept_language即可 $http_cookie $http_host #請求地址,即瀏覽器中你輸入的地址(IP或域名) $http_referer #url跳轉來源,用來記錄從那個頁面鏈接訪問過來的 $http_user_agent #用戶終端瀏覽器等信息 $http_x_forwarded_for $sent_http_NAME #可以設置任意http響應頭字段;變量名中的后半部分NAME可以替換成任意響應頭字段,如需要設置響應頭Content-length,$sent_http_content_length即可