以下是昨天工作碰到的問題場景:
我們開發了一個網站(J2EE的),放在was裡面跑(雙機),前端用apache轉發。現假設該網站的通路位址為:http://192.168.1.100:9080/hello和http://192.168.1.101:9080/hello
昨天系統上線,意味着以後要用一個統一的域名通路(假設為:www.somedomain.com),我們用apache做代理伺服器,将域名指向apache,再由apache轉發至後端的兩台was伺服器上。
apache的配置如下:
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName www.somedomain.com
ErrorLog "logs/hello-error_log"
CustomLog "logs/hello-access_log" common
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy balancer://hellocluster>
BalancerMember http://192.168.1.100:9080 route=was100
BalancerMember http://192.168.1.101:9080 route=was101
ProxySet stickysession=ROUTEID
</Proxy>
ProxyPass /hello balancer://hellocluster/hello
ProxyPassReverse /hello balancer://hellocluster/hello
</VirtualHost>
通過上面的配置,我們可以這樣通路了:http://www.somedomain.com/hello
但這還太麻煩了,為什麼,因為我們要的是直接輸入域名www.somedomain.com就能通路http://www.somedomain.com/hello,而不要手工的在位址欄上輸入上下文才能通路。
經過查找資料,決定使用apache的rewrite來達到目的,于是從網上找來了一段代碼,經過修改如下:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^ www.somedomain.com
RewriteRule ^/(.*)$ http://www.somedomain.com/hello
将這段代碼添加到上述的VirtualHost配置中後,用浏覽器通路,浏覽器報錯:循環重定向。
仔細看下rewrite的配置,如果按照上面那樣配,确實會導緻循環重定向。于是修改如下
RewriteEngine On
RewriteCond %{HTTP_HOST} ^ www.somedomain.com
RewriteRule ^/$ http://www.somedomain.com/hello
即去掉了最後一行配置中(.*)
再次測試,成功。
完整配置如下:
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName www.somedomain.com
ErrorLog "logs/hello-error_log"
CustomLog "logs/hello-access_log" common
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy balancer://hellocluster>
BalancerMember http://192.168.1.100:9080 route=was100
BalancerMember http://192.168.1.101:9080 route=was101
ProxySet stickysession=ROUTEID
</Proxy>
ProxyPass /hello balancer://hellocluster/hello
ProxyPassReverse /hello balancer://hellocluster/hello
RewriteEngine On
RewriteCond %{HTTP_HOST} ^ www.somedomain.com
RewriteRule ^/$ http://www.somedomain.com/hello
</VirtualHost>