Apache mod_rewrite中的REQUEST_URI使用實(shí)例
如下規(guī)則:
RewriteEngine on
# sitemap index xml rewrite
RewriteRule ^sitemap_([a-zA-Z0-9_\-]+)\.xml$ /sitemap/$1
# redirected all invalid request the the index bootstrap
RewriteRule !\.(htm|txt|xml|css|js|swf|gif|jpg|png|ico)$ index.php [L]
假設(shè)訪問(wèn) sitemap_index.xml ,當(dāng)經(jīng)過(guò)兩次RewriteRule之后,傳給bootstrap程序 index.php 的 $_SERVER['REQUEST_URI'] 值仍然是 /sitemap_index.xml ,但實(shí)際上希望是 /sitemap/index ,這樣 index.php 才能正確的進(jìn)行 url route 。
要達(dá)到這個(gè)目的,有兩個(gè)方法。
第一種方式,配合 mod_proxy ,將第一條重寫規(guī)則改為
# sitemap index xml rewrite
RewriteRule ^sitemap_([a-zA-Z0-9_\-]+)\.xml$ /sitemap/$1 [P,L]
這樣將在內(nèi)部產(chǎn)生一個(gè)新的URL請(qǐng)求, REQUEST_URI 的值也就變成了新的 /sitemap/index 。但這種方法制造了額外的一次 http 請(qǐng)求。
第二種方法,將第一條規(guī)則改為
# sitemap index xml rewrite
RewriteRule ^sitemap_([a-zA-Z0-9_\-]+)\.xml$ /sitemap/$1 [E=REQUEST_URI:/sitemap/$1]
或者
# sitemap index xml rewrite
RewriteRule ^sitemap_([a-zA-Z0-9_\-]+)\.xml$ index.php [E=REQUEST_URI:/sitemap/$1,L]
然后通過(guò) $_SERVER['REDIRECT_REQUEST_URI'] 變量得到 值 /sitemap/index (注意使用 E 設(shè)置環(huán)境變量的時(shí)候,mod_rewrite 自動(dòng)給變量加上 REDIRECT_ 前綴)。
有趣的是在 Rewrite 的過(guò)程中 REQUEST_URI 的值始終保持是原始的請(qǐng)求URI,但在 mod_setenvif 中提供的 SetEnvIf / SetEnvIfNoCase 中所使用的 Request_URI 屬性得到的卻是經(jīng)過(guò) rewrite 之后的地址而非原始 GET/POST 中的 URI。
所以如果在 httpd.conf / httpd-vhosts.conf 中想使用
SetEnvIfNoCase Request_URI "sitemap" ...
來(lái)針對(duì) sitemap 設(shè)置環(huán)境變量的話是不起作用的,因?yàn)檫@時(shí)候傳給 SetEnvIfNoCase 進(jìn)行判斷的 Request_URI 是 index.php 而不是 sitemap_index.xml 或 sitemap/index 。想要得到原始的 Request_URI 信息就必須在 rewrite 規(guī)則的最開始進(jìn)行保存,比如在 rewrite 規(guī)則開頭加入
SetEnvIfNoCase Request_URI "(^/sitemap_.*\.xml)" MY_REQUEST_URI_BF_REWRITE=$1
然后在需要的地方使用
SetEnvIfNoCase MY_REQUEST_URI_BF_REWRITE "sitemap" ...
相關(guān)文章
Linux下查詢外網(wǎng)IP的幾種方法總結(jié)
這篇文章主要介紹了Linux下查詢外網(wǎng)IP的幾種方法總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-03-03Ubuntu 16.04源碼編譯安裝Apache 2.4.25教程
這篇文章主要為大家詳細(xì)介紹了Ubuntu 16.04源碼編譯安裝Apache 2.4.25,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01實(shí)例分析對(duì)于歷史Linux鏡像的問(wèn)題進(jìn)行修復(fù)處理
在本篇內(nèi)容中我們給大家總結(jié)了關(guān)于對(duì)于歷史Linux鏡像的問(wèn)題進(jìn)行修復(fù)處理知識(shí)點(diǎn),有需要的朋友們跟著學(xué)習(xí)下。2019-02-02移植busybox構(gòu)建最小根文件系統(tǒng)的步驟詳解
這篇文章主要介紹了移植busybox構(gòu)建最小根文件系統(tǒng)的步驟,本文分為五部給大家介紹的非常詳細(xì),需要的朋友可以參考下2019-07-07Linux服務(wù)器利用防火墻iptables策略進(jìn)行端口跳轉(zhuǎn)的方法
這篇文章主要介紹了Linux服務(wù)器利用防火墻iptables策略進(jìn)行端口跳轉(zhuǎn)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10Windows 和 Linux 上Redis的安裝守護(hù)進(jìn)程配置方法
​ Redis是目前最常用的非關(guān)系型數(shù)據(jù)庫(kù)(NOSql)之一,常以Key-Value的形式存儲(chǔ)。這篇文章主要介紹了Windows 和 Linux 上Redis的安裝守護(hù)進(jìn)程配置 ,需要的朋友可以參考下2019-06-06詳解linux下的.net/mvc/cms程序結(jié)構(gòu)
本片文章給大家詳細(xì)分析了在linux下.net/mvc/cms程序詳細(xì)結(jié)構(gòu)說(shuō)明,了解這個(gè)對(duì)在linux下程序開發(fā)非常有用,有興趣的參考學(xué)習(xí)下吧。2017-12-12