Apache 重寫規則的常見應用 (rewrite)

本文出自:http://www.linuxforum.net 作者:吳阿亭 Jephe wu (2001-09-05 08:00:00)
一:目的

本文旨在提供如何用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) 轉換www.username.domain.com的對于username的主頁請求為
www.domain.com/username

對于HTTP/1.1的請求包括一個Host: HTTP頭,我們能用下面的規則集重寫
http://www.username.domain.com/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 www.domain.com
rewriteengine on
proxyrequest on
rewriterule ^/(.*)$ http://192.168.1.3/$1 [P,L]


注:當外部瀏覽器請求www.domain.com時被解析到IP地址1.2.3.4 ,Apache 交出
mod_rewrite處理轉換成
http://192.168.1.3/$1后再交由代理模塊mod_proxy得到內容后傳送回用戶的瀏覽器。


4) 基本預先設定的轉換MAP表進行重寫 rewritemap

轉換www.domain.com/{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|http://h.i.j.k/} [R=301,L]

文件/usr/local/apache/conf/rewrite.map的內容如下:

sg http://a.b.c.d/
sh http://e.f.g.h/

注: 當用戶請求http://www.domain.com/sg/anypath時被重寫為
http://a.b.c.d/anypath .
當需要調試時請用rewritelog and rewriteloglevel 9聯合,9為最大即得到最多的調試
信息
最小為1,最小的調試信息,默認為0,沒有調試信息。
sitemap的語法是${sitemap: LookupKey | Defaultvalue} ,有些書上把$寫成了%是錯
誤的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276618.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276618.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276618.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python怎么模擬瀏覽器交互_干貨分享:python爬蟲模擬瀏覽器的兩種方法實例分析(趕緊收藏)...

今天為大家帶來的內容是:干貨分享:python爬蟲模擬瀏覽器的兩種方法實例分析(趕緊收藏) 文章主要介紹了python爬蟲模擬瀏覽器的兩種方法,結合實例形式分析了Python爬蟲模擬瀏覽器的兩種常見操作技巧與使用注意事項,需要的朋友可以參…

vue-cli3

github:https://github.com/vuejs/vue-cli org:https://cli.vuejs.org/ guide:https://cli.vuejs.org/guide/ config:https://cli.vuejs.org/config/ 轉載于:https://www.cnblogs.com/veritas-sj/p/10147789.html

Indy中判斷郵件來源

首先從TidMessage中獲得郵件的頭信息: strHeader:aIdMessage.Headers.text; 然后,用正則表達式取出Received: vReceiveIP:GetNeedStrByPerlReg(strHeader,(Received:)(.)(])); 再取出X-Originating-IP: vOriIP:GetNeedStrByPerlReg(strHea…

用jQuery實現彈出窗口/彈出div層

原文鏈接:http://hi.baidu.com/awz_tiger/item/863cfc10c4bb0f6171d5e8d9 http://blog.163.com/qiuxinke2006126/blog/static/24885580201131763139536/ http://hi.baidu.com/kilwin/blog/item/f4cfaf2695375920c9955947.html 用div層代替傳統的彈出窗口已經變得很…

模塊定義文件導出類_濃縮的就是精華——ES6模塊精煉講解

概述在 ES6 前, 實現模塊化使用的是 RequireJS 或者 seaJS(分別是基于 AMD 規范的模塊化庫, 和基于 CMD 規范的模塊化庫)。ES6 引入了模塊化,其設計思想是在編譯時就能確定模塊的依賴關系,以及輸入和輸出的變量。ES6 的模塊化分為…

關于快速開發和設計應用系統的一些個人的意見

作為程序員,經常會為我們的客戶去開發和設計各種應用系統,比如OA /CRM/物流調度/客戶服務/電子政務。。。及各種管理信息系統,我們經常會去開發和實現這樣的一些系統,每周、每月、每年經常都要去做這樣的一些開發工作,…

Jquery1.6版本后attr的變化

原文鏈接:http://www.cnblogs.com/-run/archive/2011/11/16/2251569.html Jquery1.6版本后attr的變化 Jquery1.6版本后 attr 改動后的效果: jquery1.6版本: 下文來自www.jquery.com The difference betweenattributes and properties can b…

idea main scanner 輸入_哇曬,你竟然不知道idea的 Live Templates

最近公司新近來一名程序猿,在寫代碼時,美美寫到System.out.println的時候,都要一母不差的用鍵盤敲上去,我問他你之前有用過eclipse中的快捷方法syso嗎?于是,我給他介紹了一下,在idea中如何自定義…

Android開發需要了解的 IM 知識

引言即便在通訊如此發達的今天,IM 也依然是諸多場景下非常重要的基礎能力。因此做為 一名 Android 開發,不可避免的會遇到一些IM 相關的需求或問題。本文以一個Android開發的角度來講述IM 開發相關的基礎知識。想要閱讀更多技術干貨、行業洞察&#xff0…

偷梁換柱做自己的封裝系統

偷梁換柱做自己的封裝系統!菜鳥一開始都想把自己的信息加到系統里,但封裝系統只會一點!但我們可“拿來”,我們可以用偷梁換柱的方法來修改別人的系統,本文以雨林的GHOST5.0系統為例。一、準備工作1、當然是下載一個自己…

JQuery 1.6+ checkbox 狀態選擇

示例&#xff1a; HTML: <form><table><tr><td><input type"checkbox" id"select_all"/></td></tr><tr><td><input type"checkbox" name"select[]"/></td></…

臺電u盤量產工具_簡單幾步,讓U盤起死回生

如今&#xff0c;雖說云存儲風靡&#xff0c;但U盤仍存在價值&#xff0c;畢竟在很多場合并不方便上網&#xff0c;即便如此網上存儲有時也并不方便&#xff0c;也不安全。與此同時&#xff0c;如果是大文件存儲&#xff0c;云盤上傳和下載速度非常慢&#xff0c;并不適合海量數…

PXC集群常見錯誤(一)

歡迎關注MySQL 8.0必知必會系列課程。MySQL8.0必知必會-自動化部署 https://edu.51cto.com/course/16368.htmlMySQL8.0必知必會之參數標準化配置 https://edu.51cto.com/course/16358.html1.Cant start server: Bind on TCP/IP port: Address already in use…

獲取GridView中RowCommand的當前選中行的索引或主鍵Id

獲取GridView中RowCommand的當前索引行 前臺添加一模版列,里面添加一個LinkButton前臺 (如果在后臺代碼中用e.CommandArgument取值的話前臺代碼就必須在按鈕中設置CommandArgument的值&#xff0c;值為綁定的數據庫字段<asp:TemplateField HeaderText"操作"> …

系統架構師 項目經理 哪個更有前景_中央空調加地暖與五恒系統,哪個更省錢?...

每逢嚴冬酷暑,人們都會感嘆空調是最偉大的發明,并且隨著科技發展還在不斷進化。從烤火取暖到空調和地暖的供暖,從紙扇電扇的吹風到空調的制冷,人們的需求正在不斷提高,于是,為了滿足人們的需求&#xff0c;市場上又衍生出了家裝五恒系統。 恒溫、恒濕、恒氧、恒潔、恒靜這…

軟件架構基本原則

軟件架構本質上是繪制一幅復雜素描所打的草稿&#xff0c;我還說&#xff0c;如果你罩得住&#xff0c;可以不需要這個草稿。但這只是“理論上”&#xff0c;我們寫軟件&#xff0c;基本上不是在寫只有幾千行的代碼的小程序&#xff0c;而是寫數千萬行的大型程序。《道德經》說…

Smarty目錄結構和子目錄路徑問題

原文鏈接&#xff1a;http://bbs.csdn.net/topics/80223905 問題 1).最初在模板文件中使用了絕對路徑&#xff08;相對于站點根的路徑 ).如在system_info.tpl中圖片是這樣顯示的<img src"/templates/default/images/logo.gif"/>這樣當系統發布時&#xff0c;…

c++直角坐標系與極坐標系的轉換_一篇閱讀量高達2百6十多萬的關于坐標系和投影的相關知識探討...

本文轉載于CSDN作者rsyaoxin這是一篇關于坐標和投影的「神文」截止目前瀏覽量已達2698239是相關文章中不可打破的神話...文末有本文作者推薦的兩款坐標轉換的小工具下載鏈接回想一下&#xff0c;接觸遙感專業也有幾個年頭了&#xff0c;而現在越來越偏離遙感了&#xff0c;突然…

c# xmlhttp POST提取遠程webservice數據

public string cancel(string StudentID,string Mobile){string datanull;data "<?xml version1.0 encodingutf-8?><soap:Envelope xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:xsdhttp://www.w3.org/2001/XMLSchema xmlns:soaphttp://schemas.…

Javascript實現的左右滑動菜單

原文鏈接&#xff1a;http://www.cnblogs.com/miqi2214/archive/2009/04/28/1445308.html Javascript實現的左右滑動菜單 先看Demo便于理解&#xff1a;請大家往這里看 業務需求&#xff1a; 1. 菜單個數不固定&#xff0c;當菜單個數長度小于給定范圍寬度&#xff0c;則左右移…