摘要:指令正則匹配指令使用模塊提供的,模塊可以創(chuàng)建變量,這些變量的值與另外的變量值相關聯(lián)。根據不同的設置網站根目錄通過指令獲取到自定義值后,可以做如下設置,讓不同的測試人員對應不同的網站根目錄這里行,網站目錄可以用變量來表示。
原文鏈接:https://blog.tanteng.me/2016/... ,原文內容會不斷完善,以原文為準。
本文介紹有關 User-Agent 的知識,以及使用 Nginx map 指令配合正則表達式匹配 User Agent 自定義值,通過捕獲 UA 自定義值,可以做很多事情,其中一個場景是:讓一臺測試機支持多個測試同時測試一個項目,原理就是匹配 UA 值,設置不同的 WEB 根目錄。
關于 User AgentUser Agent 中文名為用戶代理,簡稱 UA,它是一個特殊字符串頭,使得服務器能夠識別客戶使用的操作系統(tǒng)及版本、CPU 類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等。
用 Firefox的 Firebug 工具可以看到每次請求的請求頭信息都包含 User-Agent 字段,如圖所示:
通過查看 nginx 的請求日志如 access.log,也可以查看到每次請求的 UA 信息,如果是 curl 命令方式請求,可以看到 UA 信息是 curl:
192.168.10.1 – – [10/Oct/2016:02:42:59 +0000] “GET /hello HTTP/1.1” 200 18 “-” “Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 tanteng”
127.0.0.1 – – [10/Oct/2016:02:43:23 +0000] “GET /hello HTTP/1.1” 200 22 “-” “curl/7.35.0”
這個插件可以管理和切換不同的 User-Agent,比如模擬不同的瀏覽器,或者新增自定義的 UA,可以在 UA 中帶上自己的標識。
比如新增一個自己的 UA,并加上自己的標識,如圖:
這樣 Firefox 發(fā)出的請求頭信息中 UA 就是這個修改過后的,訪問一個本地 WEB 項目,通過 firebug 或查看 nginx 的 access.log 日志,都可以發(fā)現(xiàn)請求 UA 發(fā)生了變化。
Nginx 配置匹配 User-Agent在 nginx 配置文件中,$http_user_agent 表示 UA 的值,比如瀏覽器默認 UA 值是:
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0
現(xiàn)在新增了一個 UA,UA 值是在后面加一個空格和名字,如:
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 tanteng
通過 Firefox 的 User Agent Swicher 這個插件切換到新的 UA,再通過瀏覽器訪問,UA 就是這個修改之后的。
那么,在 nginx 中如何匹配這個最后的名字呢?這里可以用到 nginx 的 map 指令配合正則表達式。
map 指令正則匹配map 指令使用 ngx_http_map_module 模塊提供的,ngx_http_map_module 模塊可以創(chuàng)建變量,這些變量的值與另外的變量值相關聯(lián)。允許分類或者同時映射多個值到多個不同值并儲存到一個變量中,map 指令用來創(chuàng)建變量,但是僅在變量被接受的時候執(zhí)行視圖映射操作,對于處理沒有引用變量的請求時,這個模塊并沒有性能上的缺失。
在 nginx 的 http 域中,增加以下代碼:
map $http_user_agent $user { default ""; ~curl curl; ~(?[S]+$) $name; }
這里正則表達式 [S]+$ 即匹配最后一個非空白字符,?
這個 map 域的意思是,匹配對象是 $http_user_agent,即 UA,默認 $user 值是空字符串,如果是 curl 開頭的,$user 值就是 curl,如果可以匹配到最后一個非空字符串,那么 $user 的值就是這個最后的字符串。
在 server 域中添加如下測試代碼:
location /hello { echo http_user_agent:$http_user_agent; echo user:$user; }
執(zhí)行 curl 命令:curl www.tanteng.me/hello
返回結果:
http_user_agent:curl/7.35.0
user:curl
在瀏覽器中訪問,輸出結果是:
http_user_agent:Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 tanteng
user:tanteng
這樣就成功獲取到 UA 后面增加的一個值。
Nginx 根據不同的 UA 設置網站根目錄通過 map 指令獲取到 UA 自定義值后,可以做如下設置,讓不同的測試人員對應不同的網站根目錄:
location ~ .php$ { try_files $uri =404; root /usr/share/nginx/html/$user/public; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
這里 root 行,網站目錄可以用 $user 變量來表示。比如測試人員 ruike,他修改自己的 UA 后面加上 ruike,那么訪問的網站根目錄是 /usr/share/nginx/html/ruike/public,這樣不同的測試人員在自己的各自目錄拉取代碼,互不影響,支持同時進行測試。
測試一下效果,把 public 下的 index.php 文件前面用 echo ‘wo shi ruike.’;exit; 輸出。
切換到 ruike 這個 UA,訪問網站,顯示的即是以上內容,切換回 tanteng 這個 UA,顯示的是正常的網站內容,這就達到了通過 UA 自定義值設置不同的網站根目錄的效果,也就支持了一臺測試機支持不同的測試人員同時進行測試的需求。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://www.ezyhdfw.cn/yun/39352.html
摘要:上面的代碼中定義了一個名為的負載均衡器,里面有三個后端服務,他們是按的方式進行輪詢的。在模塊中,可以設置后端服務器的信息,同時還可以設定每個后端服務器在負載均衡調度中的狀態(tài)。常用的狀態(tài)有表示當前的暫時不參與負載均衡。 最近在學習如何對 Nginx 進行配置,故而對 Nginx 的配置文件的結構功能有了一些新的認識。剛開始接觸 Nginx 時,感覺它的配置十分高深、難以理解,需要配置什么...
摘要:在本文中,我們繼續(xù)延續(xù)前文,從前文給出的一份示例配置清單開始,詳解一下服務器的各種配置指令的作用和用法。是否允許同時接收多個網絡連接指令格式該指令默認為狀態(tài),意指每個一次只能接收一個新到達的網絡連接。 本文已獲得原作者CodeSheep授權。showImg(https://segmentfault.com/img/remote/1460000015646704); 概述 在前面《Ngi...
摘要:在本文中,我們繼續(xù)延續(xù)前文,從前文給出的一份示例配置清單開始,詳解一下服務器的各種配置指令的作用和用法。是否允許同時接收多個網絡連接指令格式該指令默認為狀態(tài),意指每個一次只能接收一個新到達的網絡連接。 本文已獲得原作者CodeSheep授權。showImg(https://segmentfault.com/img/remote/1460000015646704); 概述 在前面《Ngi...
摘要:在本文中,我們繼續(xù)延續(xù)前文,從前文給出的一份示例配置清單開始,詳解一下服務器的各種配置指令的作用和用法。是否允許同時接收多個網絡連接指令格式該指令默認為狀態(tài),意指每個一次只能接收一個新到達的網絡連接。 showImg(https://segmentfault.com/img/remote/1460000015385948); 概述 在前面《Nginx服務器開箱體驗》 一文中我們從開箱...
閱讀 2110·2021-10-08 10:04
閱讀 3150·2021-09-22 10:02
閱讀 2396·2019-08-30 15:56
閱讀 884·2019-08-30 15:54
閱讀 989·2019-08-30 15:54
閱讀 1350·2019-08-30 15:53
閱讀 2572·2019-08-30 11:21
閱讀 3616·2019-08-30 10:56