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