Apache 重寫規則的常見應用 (rewrite)(轉)
Apache 重寫規則的常見應用 (rewrite)(轉)[@more@]一:目的 本文旨在提供如何用Apache重寫規則來解決一些常見的URL重寫方法的問題,透過常見的例項給使用者一些使用重寫規則的基本方法和線索。 二:為什麼需要用重寫規則? 一個網站,如果是長期需要放在internet上提供服務,必定會有不斷地更新和維護,如臨時轉移到其它伺服器進行維護,重新組織目錄結構,變換URL甚至改變到新的域名等等,而為了讓客戶不會因此受到任何影響,最好的方法就是使用Apache Rewrite Rule(重寫規則)。 三: 重寫規則的作用範圍 1) 可以使用在Apache主配置檔案httpd.conf中 2) 可以使用在httpd.conf裡定義的虛擬主機配置中 3) 可以使用在基本目錄的跨越配置檔案.htaccess中 四:重寫規則的應用條件 只有當使用者的WEB請求最終被導向到某臺WEB伺服器的Apache後臺,則這臺WEB伺服器接受進來的請求,根據配置檔案該請求是主配置還是虛擬主機,再根據使用者在瀏覽器中請求的URI來配對重寫規則並且根據實際的請求路徑配對.htaccess中的重寫規則。最後把請求的內容傳回給使用者,該響應可能有兩種: 1) 對瀏覽器請求內容的外部重定向(Redirect)到另一個URL。 讓瀏覽器再次以新的URI發出請求(R=301或者R=302,臨時的或是永久的重定向) 如:一個網站有正規的URL和別名URL,對別名URL進行重定向到正規URL,或者網站改換成了新的域名 則把舊的域名重定向到新的域名(Redirect) 2) 也可能是由Apache內部子請求代理產生新的內容送回給客戶[P,L] 這是Apache內部根據重寫後的URI內部透過代理模組請求內容並送回內容給客戶,而客戶端瀏覽器並 不知道,瀏覽器中的URI不會被重寫。但實際內容被Apache根據重寫規則後的URI得到。 如:在公司防火牆上執行的Apache啟動這種代理重寫規則,代理對內部網段上的WEB服務器的請求。 五:重寫規則怎樣工作? 我們假定在編譯Apache時已經把mod_rewrite編譯成模組,確信你的httpd.conf中有 LoadModule rewrite_module libexec/mod_rewrite.so 並且在Addmodule中有 Addmodule mod_rewrite.c 則可以使用重寫規則。 當外部請求來到Apache,Apache呼叫重寫規則中的定義來重寫由使用者瀏覽器指定請求的URI,最後被重寫的URI如果是重定向,則送由瀏覽器作再一次請求;如果是代理則把重寫後的URI交給代理模組請求最終的內容(Content),最後把內容送回給瀏覽器。 六: 何時使用.htaccess中的重寫規則定義? 假如你對你的的網站內容所在的伺服器沒有管理員許可權,或者你的網站放在ISP的伺服器上託管等等條件下,你無法改寫主配置檔案,然而你可以對你的WEB站點內容所在的目錄有寫許可權,則你可以設定自己的.htaccess 檔案達到同樣的目的。但你需要確定主配置檔案中對你的網站所在的目錄定義了下面的內容: Options Indexes FollowSymLinks AllowOverride all 否則你的.htaccess不會工作。 七: 應用舉例 假定Apache被編譯安裝在主機192.168.1.56的/usr/local/apache/ 目錄下面,我們編譯進了重寫和代理模組。 1) 隱藏Apache下的某個目錄,使得對該目錄的任何請求都重定向到另一個檔案。 a> httpd.conf的實現方法 我們放下面的部分到/usr/local/apache/conf/httpd.conf options Indexes followsymlinks allowoverride all rewriteengine on rewritebase / rewriterule ^(.*)$ index.html.en [R=301] 注:rewriteengine on 為重寫引擎開關,如果設為off,則任何重寫規則定義將不被應用,該開關的另一好處就是如果為了臨時拿掉重寫規則,則改為off再重啟動Apache即可,不必將下面一條條的重寫規則註釋掉。 rewritebase / 的作用是如果在下面的rewriterule定義中被重寫後的部分(此處為檔案名index.html.en)前面沒有/,則是相對目錄,相對於這個rewritebase後面的定義也就是/usr/local/apache/htdocs/index.html.en,否則,如果此處沒有rewritebase /這一項,則被重寫成 http://192.168.1.56/usr/local/apache/htdocs/manual/index.html.en ,顯然是不正確的。 不過這裡我們也可以不用rewritebase / , 而改為 rewriteengine on rewriterule ^(.*)$ /index.html.en [R=301] 或者 rewriteengine on rewriterule ^(.*)$ http://192.168.1.56/index.html.en [R=301] b> .htaccess的實現方法 我們先放下面的部分到httpd.conf options Indexes followsymlinks allowoverride all 然後放下面的部分到/usr/local/apache/htdocs/manual/.htaccess中 rewriteengine on rewritebase / rewriterule ^(.*)$ index.html.en [R=301] 注:對檔案.htaccess所作的任何改動不需要重啟動Apache. 問:要是把這個manual目錄重定向到使用者jephe的自己的主目錄呢? 用下面的.htaccess方案。 rewriteengine on rewritebase /~jephe/ rewriterule ^(.*)$ $1 [R=301] 則對manual目錄下任何檔案的請求被重定向到~jephe目錄下相同檔案的請求。 2) 轉換的對於username的主頁請求為 對於HTTP/1.1的請求包括一個Host: HTTP頭,我們能用下面的規則集重寫 http:///anypath 到 /home/username/anypath Rewriteengine on rewritecond %{HTTP_HOST} ^www.[^.]+.host.com$ rewriterule ^(.+) %{HTTP_HOST}$1 [C] rewriterule ^www.([^.]+).host.com(.*) /home/$1$2 注: rewritecond 條件重寫規則,當滿足後面定義的條件後才會應用下面的重寫規則,rewritecond有各種變數 ,請查閱相關文件。 3) 防火牆上的重寫規則代理內部網段上伺服器的請求。 NameVirtualhost 1.2.3.4 servername rewriteengine on proxyrequest on rewriterule ^/(.*)$ http://192.168.1.3/$1 [P,L] 注:當外部瀏覽器請求時被解析到IP地址1.2.3.4 ,Apache 交出mod_rewrite處理轉換成 http://192.168.1.3/$1後再交由代理模組mod_proxy得到內容後傳送回使用者的瀏覽器。4) 基本預先設定的轉換MAP表進行重寫 rewritemap 轉換/{countrycode}/anypath 到Map表中規定的URI,上面是虛擬主機中的定義 rewritelog /usr/local/apache/logs/rewrite.log rewriteloglevel 9 rewriteengine on proxyrequest on rewritemap sitemap txt:/usr/local/apache/conf/rewrite.map rewriterule ^/([^/]+)+/(.*)$ http://%{REMOTE_HOST}::$1 [C] rewriterule (.*)::([a-z]+)$ ${sitemap:$2|} [R=301,L] 檔案/usr/local/apache/conf/rewrite.map的內容如下: sg sh 注: 當使用者請求http:///sg/anypath時被重寫為anypath . 當需要除錯時請用rewritelog and rewriteloglevel 9聯合,9為最大即得到最多的除錯資訊 最小為1,最小的除錯資訊,預設為0,沒有除錯資訊。 sitemap的語法是${sitemap: LookupKey | Defaultvalue} ,有些書上把$寫成了%是錯誤的
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-937350/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Apache之Rewrite和RewriteRule規則梳理以及http強轉https的配置總結ApacheHTTP
- nginx配置location總結及rewrite規則寫法Nginx
- eslint常見規則列表EsLint
- nginx location匹配及rewrite規則Nginx
- iptables防火牆簡介,原理,規則編寫,常見案例防火牆
- 在 apache 中重寫規則不生效的問題 [No input file specified.] 解決Apache
- 常見的社會潛規則有哪些?
- 業務規則的常見問題解答
- Nginx location匹配及Rewrite重寫Nginx
- URL重寫(rewrite)的具體實現與異常問題解決
- nginx偽靜態規則重寫Nginx
- Apache Rewrite詳解Apache
- Nginx URL重寫規則配置詳解Nginx
- 輪換代理的四種常見輪換規則
- Apache 常見問題Apache
- Drools 規則引擎應用
- SSH原理常見應用升級及埠轉發
- Go 應用中 package main 的規則GoPackageAI
- 重寫遵循的原則
- django | 常見 SQL 及其對應的 ORM 寫法DjangoSQLORM
- Redis常見應用場景Redis
- 軟體開發的常見認知規律和原則 - Reflectoring
- Apache Spark常見的三大誤解ApacheSpark
- JavaScript中的bind方法及其常見應用JavaScript
- 常見的並聯諧振應用案例
- 流的基本概念以及常見應用
- Nginx Rewrite實際應用配置解析Nginx
- 快應用稽核常見問題
- mysql常見的查詢語句的應用MySql
- sql改寫優化:簡單規則重組實現SQL優化
- 架構的常規分類及複用重點架構
- 常見的正規表示式
- 對web應用程式安全的常見誤解Web
- 【應用服務 App Service】 App Service Rewrite 例項 - 反向代理轉發功能APP
- Nginx 跳轉規則Nginx
- 推特大規模應用的流處理框架:Apache Heron框架Apache
- PbootCMS網站apache偽靜態規則boot網站Apache
- 知名VC:蘋果應用商店的規則重要嗎?蘋果
- 4.編寫規則