apache中的mod_proxy模塊主要作用就是進行url的轉發,即具有代理的功能。應用此功能,可以很方便的實現同tomcat等應用服務器的整合,甚者可以很方便的實現web集群的功能。
例如使用apache作為域名www.test.com代理服務器,讓其暴露在公網上,即DNS解析到本機器上,真正提供web服務器的是另一台位於同一內網的機器上,假設起IP是192.168.100.22,那么只需要如下配置就可以了。
ProxyPass / http://192.168.100.22/
ProxyPassReverse / http://192.168.100.22/
ProxyPass 很好理解,就是把所有來自客戶端對http://www.test.com的請求轉發給http://192.168.100.22上進行處理
ProxyPassReverse 的配置總是和ProxyPass 一致,但用途很讓人費解。似乎去掉它很能很好的工作,事實真的是這樣么,其實不然,如果響應中有302重定向,ProxyPassReverse就派上用場。舉例說明,假設用戶訪問http://www.test.com/exam.php,通過轉發交給http://192.168.100.22 /exam.php處理,假定exam.php處理的結果是實現redirect到login.php(使用相對路徑,即省略了域名信息),如果沒有配置反向代理,客戶端收到的請求響應是重定向操作,並且重定向目的url為http://192.168.100.22/login.php ,而這個地址只是代理服務器能訪問到的,可想而知,客戶端肯定是打不開的,反之如果配置了反向代理,則會在轉交HTTP重定向應答到客戶端之前調整它為 http://www.test.com/login.php,即是在原請求之后追加上了redirect的路徑。當客戶端再次請求http: //www.test.com/login.php,代理服務器再次工作把其轉發到http://192.168.100.22/login.php。
客戶端到服務器稱之為正向代理,那服務器到客戶端就叫反向代理。
ProxyPass與ProxyPassReverse及ProxyPassMatch這幾個都是APACHE的代理指令
1、ProxyPass:
語法:ProxyPass [path] !|url
它主要是用作URL前綴匹配,不能有正則表達式,它里面配置的Path實際上是一個虛擬的路徑,在反向代理到后端的url后,path是不會帶過去的,使用示例:
1)、ProxyPass / images/ !
這個示例表示,/images/的請求不被轉發。
- 1
- 2
2)、ProxyPass /mirror/foo/ http://backend.example.com/
我們假設當前的服務地址是http://example.com/,如果我們做下面這樣的請求:
http://example.com/mirror/foo/bar
那將被轉成內部請求:
http://backend.example.com/bar
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
注:配置的時候,不需要被轉發的請求,要配置在需要被轉發的請求前面。
2、ProxyPassMatch
語法:ProxyPassMatch [regex] !|url
這個實際上是url正則匹配,而不是簡單的前綴匹配,匹配上的regex部分是會帶到后端的url的,這個是與ProxyPass不同的。使用示例:
1、ProxyPassMatch ^/images !
這個示例表示對/images的請求,都不會被轉發。
- 1
- 2
2、ProxyPassMatch ^(/.*.gif)http://backend
1
這個示例表示對所有gif圖片的請求,都被會轉到后端,如此時請求
http://example.com/foo/bar.gif,
那內部將會轉換為這樣的請求
http://backend.example.com/foo/bar.gif。
- 1
- 2
- 3
- 4
- 5
3、ProxyPassReverse
語法:ProxyPassReverse [路徑] url
它一般和ProxyPass指令配合使用,此指令使Apache調整HTTP重定向應答中Location, Content-Location, URI頭里的URL,這樣可以避免在Apache作為反向代理使用時。
后端服務器的HTTP重定向造成的繞過反向代理的問題。參看下面的示例
ProxyPass /example http://www.example.com/
ProxyPassReverse /example http://www.example.com/