最近遇到一些apache配置問題,需要做這樣乙個需求,進來的url裡面有帶了版本號的資訊,例如v123這樣的,需要根據這個資訊設定乙個伺服器環境變數,然後**中讀取這個變數以確定當前版本,做一些邏輯。一開始想到的方案是用apache的setenvif指令,用正則匹配uri中的v123,然後設定到環境變數中去
setenvif request_uri "^/(v[0-9]+)/.*" version=$1
這樣我就可以在**中用$_server['version']來讀到當前請求的版本資訊,一開始work得挺好
後來有個問題,有另一種鏈結,它的版本號資訊是帶在get引數裡的,這個version的值一直是空的,查了官網發現有這麼一句
request_uri 在http請求行中請求的資源(通常是url中去除協議、主機以及查詢字串後剩餘的部分)。
於是,在setenvif這個指令裡,這個request_uri並不是apache通常指的那個uri,它是url裡去掉網域名稱和query_string的那部分,然後這個指令就搞不定了。然後我就試了一下setenvif裡能不能直接用query_string去匹配呢?結果是不行,應該是這個指令不支援跟query_string的匹配
然後我想到在rewrite規則裡是可以對query_string做匹配的,於是我就想能不能先做一次rewrite,在rewrite裡面取到get引數裡的版本號資訊,重寫url,讓新的url裡面帶上版本號資訊,然後執行setenvif指令的時候不就能取到版本號資訊了麼?這個想法太完美啦!
rewriteengine on
rewritecond % ^/redirect.*
rewritecond % ^.*(v[0-9]+).*
rewriterule /redirect.php /%1/redirect.php
setenvif request_uri "^/(v[0-9]+)/.*" version=$1
也就是說如果請求是mydomain/redirect開頭的請求,我就去它的query_string裡面找v123的版本資訊,然後把這個請求重定向到mydomain/v123/redirect...這裡去
結果事實證明我太天真了,rewrite規則是生效了,也重定向到了正確的頁面,但是$_server['version']這個變數的值仍然是空的。推測是這樣的,apache的一次請求就做一次環境變數的設定,在重定向的時候是不會根據新的url執行setenvif指令的
然後又是各種搜尋,終於發現在rewriterule裡面有乙個設定環境變數的引數
15. 'env|e=var:val' (設定環境變數)
設定名為var的環境變數的值為val,其中val中可以含有正則式的後向引用($n或%n)。這個標誌可以使用多次,以設定多個環境變數。這兒設定 的變數,可以在多種情況下被引用,如在xssi或cgi中。另外,也可以在rewritecond模板中以%的形式被引用。
這樣就可以只針對版本號資訊在get引數的情況做乙個rewrite規則的同時設定一下環境變數就好啦
rewriteengine on
rewritecond % ^/redirect.*
rewritecond % ^.*(v[0-9]+).*
rewriterule /redirect.php /redirect.php [e=version:%1]
setenvif request_uri "^/(v[0-9]+)/.*" version=$1
搞定!這樣就可以在**裡順利取到version的值啦。但是文中還有一句「這個標誌可以使用多次,以設定多個環境變數」,但是這多個環境變數要怎麼設定呢?只好自己試一試了,最後還真的被我試出來了
rewriteengine on
rewritecond % ^/redirect.*
rewritecond % ^.*(v[0-9]+).*
rewriterule /redirect.php /redirect.php [e=version:%1,e=abc:%1/others]
setenvif request_uri "^/(v[0-9]+)/.*" version=$1
這樣我就可以取到2個環境變數的值了,搞定!
apache中文幫助:
某位老兄的部落格:
為何需設定環境變數及如何設定環境變數
windows系統下,假如我們安裝了某一款軟體,安裝結束後,在安裝目錄會生成乙個該軟體的.exe檔案,雙擊該檔案,我們就能啟動軟體。但是難道我們每次要執行該軟體的時候都要先找到該.exe檔案所在的路徑,然後雙擊嗎,顯然是不可能的,因為安裝的軟體太多,我們根本不可能記住所有已安裝軟體的路徑,同時如果我...
設定環境變數
一.何謂環境變數 在所處的環境中,那些供系統或應用程式取用,而固定存在的一種特殊變數,稱之.環境變數可由系統預定或由您自行定義及修改,又稱為整體變數.也就是說 不管你身處何方,這些變數的值都跟著你的環境而存在.例如 path,shell,term等.顯示環境變數的方法如下 echo 變數名稱 如 e...
設定環境變數
1.export path path 路徑 2.修改 etc profile 3.修改 root bashrc 二三中方法需要登出生效 1.確保安裝了標準c開發環境,指令驗證 sudo apt get install build essential。如果安裝提示你的版本最新,否則直接自動安裝。arm...