在YMU系统中,我们使用Apache 2.x作为前端Web Server,用于静态内容的保存和获取,及动态内容向后端Web Server(Tomcat)的转发;同时Apache 2.x也承担Tomcat服务器之间的负载均衡器。
<o:p> </o:p>
从性能方面考虑,YMU系统的大部分页面采用http协议传输。而某些页面,如注册、登录和修改密码等安全性要求高的页面,则需要采用https协议进行传输。
<o:p> </o:p>
如何在http及https协议之间转换?最直接的办法是采用绝对路径,此方法优点是间接明了,缺点是移植性差。一个比较好的方法是使用Apache的rewrite模块对相对路径进行转换,从而达到协议转换的目的。
<o:p> </o:p>
我们可以在Apache的官方文档中找到http/https切换的相关说明:
RewriteEngine on<o:p></o:p>
RewriteRule ^/(.*):SSL$ https://%{SERVER_NAME}/$1 [R,L]<o:p></o:p>
RewriteRule ^/(.*):NOSSL$ http://%{SERVER_NAME}/$1 [R,L]<o:p></o:p>
<o:p> </o:p>
如果直接定义在httpd.conf,则会有以下问题:
<o:p> </o:p>
下面举例说明配置过程。假设我们在相对路径url后增加_ssl表示以https协议装载url;而url后面增加_nossl则用于在https页面中跳转回http协议。配置步骤如下:
<o:p> </o:p>
<!---->1. <!---->编译Apache时,生成rewrite模块(mod_rewrite.so);
<!---->2. <!---->在httpd.conf中装载rewrite模块,并定义http->https的转换规则:
LoadModule rewrite_module modules/mod_rewrite.so<o:p></o:p>
<o:p> </o:p>
<ifmodule rewrite_module=""><o:p></o:p></ifmodule>
RewriteEngine On <o:p></o:p>
#RewriteLog "/usr/local/apache2/logs/rewrite.log"<o:p></o:p>
#RewriteLogLevel 10<o:p></o:p>
RewriteRule ^/(.*)_ssl$ https://%{SERVER_NAME}/$1 [R,L]<o:p></o:p>
<o:p></o:p>
RewriteRule ^/(.*)_nossl$ http://%{SERVER_NAME}/$1 [R,L]<o:p>
</o:p>
其中:
3. 在 ssl 配置文件 (conf/extra/httpd-ssl.conf) 中定义 https->http 的转换规则:<!---->
- <!----> <!---->^/(.*)_ssl$:表示 以 / 开头,以_ssl结尾;
- <!----><!---->https://%{SERVER_NAME}/$1:$1表示URL中 / 后 与 _ssl之前的部分内容;
- <!----> <!---->[R, L]:R表示重定向;L表示最后一条规则,即若符合条件,则不再匹配下面规则;
LoadModule rewrite_module modules/mod_rewrite.so<o:p></o:p>
<o:p> </o:p>
<virtualhost _default_:443=""><o:p></o:p></virtualhost>
……<o:p></o:p>
<ifmodule rewrite_module=""><o:p></o:p></ifmodule>
RewriteEngine On<o:p></o:p>
RewriteRule ^/(.*)_nossl$ http://%{SERVER_NAME}/$1 [R,L]<o:p></o:p>
<o:p></o:p>
<o:p></o:p>
<o:p> </o:p>RewriteRule ^/(.*)_ssl$ https://%{SERVER_NAME}/$1 [R,L]
注:
<o:p> </o:p>
<!---->4. <!---->再根据规则修改页面中的URL。
<o:p> </o:p>
哈哈,大功告成!