Apache的Mod rewrite學習(二)

2021-04-01 19:24:45 字數 4060 閱讀 8574

今天學習重寫規則的語法。

rewriterule

syntax: rewriterule pattern substitution [flags]

一條rewriterule指令,定義一條重寫規則,規則間的順序非常重要。對apache1.2及以後的版本,模板(pattern)是乙個posix正則式,用以匹配當前的url。當前的url不一定是用記最初提交的url,因為可能用一些規則在此規則前已經對url進行了處理。

對mod_rewrite來說,!是個合法的模板字首,表示「非」的意思,這對描述「不滿足某種匹配條件」的情況非常方便,或用作最後一條預設規則。當使用!時,不能在模板中有分組的萬用字元,也不能做後向引用。

當匹配成功後,substitution會被用來替換相應的匹配,它除了可以是普通的字串以外,還可以包括:

$n,引用rewriterule模板中匹配的相關字串,n表示序號,n=0..9

%n,引用最後乙個rewritecond模板中匹配的資料,n表示序號

%,伺服器變數

$,對映函式呼叫

這些特殊內容的擴充套件,按上述順序進行。

乙個url的全部相關部分都會被substitution替換,而且這個替換過程會一直持續到所有的規則都被執行完,除非明確地用l標誌中斷處理過程。

當susbstitution有」-」字首時,表示不進行替換,只做匹配檢查。

利用rewriterule,可定義含有請求串(query string)的url,此時只需在sustitution中加入乙個?,表示此後的內容放入query_string變數中。如果要清空乙個query_string變數,只需要以?結束substitution串即可。

如果給乙個substitution增加乙個http://thishost[:port]的字首,則mod_rewrite會自動將此字首去掉。因此,利用http://thisthost做乙個無條件的重定向到自己,將難以奏效。要實現這種效果,必須使用r標誌。

flags是可選引數,當有多個標誌同時出現時,彼此間以逗號分隔。

'redirect|r [=code]' (強制重定向)

給當前的uri增加字首http://thishost[:thisport]/, 從而生成乙個新的url,強制生成乙個外部重定向(external redirection,指生的url傳送到客戶端,由客戶端再次以新的url發出請求,雖然新url仍指向當前的伺服器). 如果沒有指定的code值,則http應答以狀態值302 (moved temporarily),如果想使用300-400(不含400)間的其它值可以通過在code的位置以相應的數字指定,也可以用標誌名指定: temp (預設值), permanent, seeother.

注意,當使用這個標誌時,要確實substitution是個合法的url,這個標誌只是在url前增加http://thishost[:thisport]/字首而已,重寫操作會繼續進行。如果要立即將新url重定向,用l標誌來中重寫流程。

'forbidden|f' (強制禁止訪問url所指的資源)

立即返回狀態值403 (forbidden)的應答包。將這個標誌與合適的rewriteconds 聯合使用,可以阻斷訪問某些url。

'gone|g' (強制返回url所指資源為不存在(gone))

立即返回狀態值410 (gone)的應答包。用這個標誌來標記url所指的資源永久消失了.

# 'proxy|p' (強制將當前url送往**模組(proxy module))

這個標誌,強制將substitution當作乙個發向**模組的請求,並立即將共送往**模組。因此,必須確保substitution串是乙個合法的uri (如, 典型的情況是以http://hostname開頭),否則會從**模組得到乙個錯誤. 這個標誌,是proxypass指令的乙個更強勁的實現,將遠端請求(remote stuff)對映到本地伺服器的名字空間(namespace)中來。

注意,使用這個功能必須確保**模組已經編譯到apache 伺服器程式中了. 可以用「httpd -l 」命令,來檢查輸出中是否含有mod_proxy.c來確認一下。如果沒有,而又需要使用這個功能,則需要重新編譯``httpd''程式並使用mod_proxy有效。

'last|l' (最後一條規則)

中止重寫流程,不再對當前url施加更多的重寫規則。這相當於perl的last命令或c的break命令。

'next|n' (下一輪)

重新從第一條重寫規則開始執行重寫過程,新開的過程中的url不應當與最初的url相同。 這相當於perl的next命令或c的continue命令. 千萬小心不要產生死迴圈。

# 'chain|c' (將當前的規則與其後續規則綑綁(chained))

當規則匹配時,處理過程與沒有綑綁一樣;如果規則不匹配,則綑綁在一起的後續規則也不在檢查和執行。

'nosubreq|ns' (used only if no internal sub-request )

這個標誌強制重寫引擎跳過為內部sub-request的重寫規則.例如,當mod_include試圖找到某一目錄下的預設檔案時 (index.***),sub-requests 會在apache內部發生. sub-requests並非總是有用的,在某些情況下如果整個規則集施加到它上面,會產生錯誤。利用這個標誌可排除執行一些規則。

'nocase|nc' (模板不區分大小寫)

這個標誌會使得模板匹配當前url時忽略大小寫的差別。

'noescape|ne' (不對輸出結果中的特殊字元進行轉義處理)

通常情況下,mod_write的輸出結果中,特殊字元(如'%', '$', ';', 等)會轉義為它們的16進製制形式(如分別為'%25', '%24', and '%3b')。這個標誌會禁止mod_rewrite對輸出結果進行此類操作。 這個標誌只能在 apache 1.3.20及以後的版本中使用。

'passthrough|pt' (通過下乙個處理器)

這個標誌強制重寫引擎用filename欄位的值來替換內部request_rec資料結構中uri欄位的值。. 使用這個標誌,可以使後續的其它uri-to-filename轉換器的alias、scriptalias、redirect等指令,也能正常處理rewriterule指令的輸出結果。用乙個小例子來說明它的語義:如果要用mod_rewrite的重寫引擎將/abc轉換為/def,然後用mod_alas將/def重寫為ghi,則要:

rewriterule ^/abc(.*) /def$1 [pt]

alias /def /ghi

如果pt標誌被忽略,則mod_rewrite也能很好完成工作,如果., 將 uri=/abc/... 轉換為filename=/def/... ,完全符合乙個uri-to-filename轉換器的動作。接下來 mod_alias 試圖做 uri-to-filename 轉換時就會出問題。

注意:如果要混合都含有url-to-filename轉換器的不同的模組的指令,必須用這個標誌。最典型的例子是mod_alias和mod_rewrite的使用。

'skip|s=num' (跳過後面的num個規則)

當前規則匹配時,強制重寫引擎跳過後續的num個規則。用這個可以來模仿if-then-else結構:then子句的最後一條rule的標誌是skip=n,而n是else子句的規則條數。

'env|e=var:val' (設定環境變數)

設定名為var的環境變數的值為val,其中val中可以含有正則式的後向引用($n或%n)。這個標誌可以使用多次,以設定多個環境變數。這兒設定的變數,可以在多種情況下被引用,如在xssi或cgi中。另外,也可以在rewritecond模板中以%的形式被引用。

注意:一定不要忘記,在伺服器範圍內的配置檔案中,模板(pattern)用以匹配整個url;而在目錄範圍內的配置檔案中,目錄字首總是被自動去掉後再進行模板匹配的,且在替換完成後自動再加上這個字首。這個功能對很多種類的重寫是非常重要的,因為如果沒有去字首,則要進行父目錄的匹配,而父目錄的資訊並不是總能得到的。乙個例外是,當substitution中有http://打頭時,則不再自動增加字首了,如果p標誌出現,則會強制轉向**。

注意:如果要在某個目錄範圍內啟動重寫引擎,則需要在相應的目錄配置檔案中設定「rewriteengine on」,且目錄的「options followsymlinks」必須設定。如果管理員由於安全原因沒有開啟followsymlinks,則不能使用重寫引擎

APACHE優化之apache的記憶體使用

keepalive引數 keepalivetimeout這個引數決定了,在什麼都不做之前,乙個http程序能夠等待多長時間?設想一下,如果keepalive設定為on,而keepalivetimeout設定為乙個比較大的數字,apache占用記憶體會很快的增長。這是因為,乙個apache程序完成了乙...

Apache服務(三)Apache服務支援的語言

1.html 預設支援的語言 2.php 1 編輯php的預設測試頁 退出儲存後開啟瀏覽器檢視什麼都檢視不到 2 yum install php y 安裝php軟體 systemctl restart httpd 重啟服務 再次檢視可以檢視到藍色頁面 註冊的介面cgi 普通閘道器介面 網路的語言裝換...

Apache文件手冊 安裝Apache

安裝 在linux或unix環境下安裝 必需條件 將檔案解壓到某個目錄,例如 srclib apr 和 srclib apr util 2 pcre庫 這是httpd必需的模組 3 磁碟空間 至少50m臨時空間 4 ansi c編譯器和構建環境 5 精確的時間設定,使用ntpdate或者xntpd程...