如何在Apache中方便地切换http和https?

原创 2007年09月20日 21:04:00

YMU系统中,我们使用Apache 2.x作为前端Web Server,用于静态内容的保存和获取,及动态内容向后端Web Server(Tomcat)的转发;同时Apache 2.x也承担Tomcat服务器之间的负载均衡器。

 

从性能方面考虑,YMU系统的大部分页面采用http协议传输。而某些页面,如注册、登录和修改密码等安全性要求高的页面,则需要采用https协议进行传输。

 

如何在httphttps协议之间转换?最直接的办法是采用绝对路径,此方法优点是间接明了,缺点是移植性差。一个比较好的方法是使用Apacherewrite模块对相对路径进行转换,从而达到协议转换的目的。

 

我们可以在Apache官方文档中找到http/https切换的相关说明:

RewriteEngine on

RewriteRule ^/(.*):SSL$ https://%{SERVER_NAME}/$1 [R,L]

RewriteRule ^/(.*):NOSSL$ http://%{SERVER_NAME}/$1 [R,L]

 

如果直接定义在httpd.conf,则会有以下问题:

l         在页面中点击这些特殊的URL(login.html:SSL)时,浏览器会报协议错误,它把:SSL前面的内容(login.html)当作协议了;

l         如果把“:”改成“_”或其他字符,则http可以转到https了,而https则不能转成http。什么原因呢?看了很多文档,才发现rewrite规则设置是针对虚拟主机的,而443端口被配置成另外的虚拟主机,所以就规则就失效了,还得在ssl配置文件(httpd-ssl.conf)中设置转发规则。

 

下面举例说明配置过程。假设我们在相对路径url后增加_ssl表示以https协议装载url;而url后面增加_nossl则用于在https页面中跳转回http协议。配置步骤如下:

 

1.       编译Apache时,生成rewrite模块(mod_rewrite.so);

2.       httpd.conf中装载rewrite模块,并定义http->https的转换规则:

LoadModule rewrite_module modules/mod_rewrite.so

 

<IfModule rewrite_module>

RewriteEngine On                                                         

#RewriteLog "/usr/local/apache2/logs/rewrite.log"

#RewriteLogLevel 10

RewriteRule ^/(.*)_ssl$ https://%{SERVER_NAME}/$1 [R,L]

RewriteRule ^/(.*)_nossl$ http://%{SERVER_NAME}/$1 [R,L]

</IfModule>

 

其中:

  • RewriteEngine On:打开转换引擎;
  • RewriteLog:定义日志文件,用于调试;
  • RewriteLogLevl:设置日志级别,0表示不输出;数字越大,则输出信息越详细;
  • RewriteRule:定义转换规则,其中:
  • ^/(.*)_ssl$:表示 / 开头,以_ssl结尾;
  • https://%{SERVER_NAME}/$1$1表示URL / _ssl之前的部分内容;
  • [R, L]R表示重定向;L表示最后一条规则,即若符合条件,则不再匹配下面规则;
3.       ssl配置文件(conf/extra/httpd-ssl.conf)中定义https->http的转换规则:

LoadModule rewrite_module modules/mod_rewrite.so

 

<VirtualHost _default_:443>

……

<IfModule rewrite_module>

RewriteEngine On

RewriteRule ^/(.*)_nossl$ http://%{SERVER_NAME}/$1 [R,L]

RewriteRule ^/(.*)_ssl$ https://%{SERVER_NAME}/$1 [R,L]

</IfModule>

</VirualHost>

 

注:

  • 虽然ssl配置文件会被httpd.conf包括,LoadModule还是需要的;
  • <IfModule>…</IfModule>需要定义在VirtualHost内部。

 

4.       再根据规则修改页面中的URL

 

哈哈,大功告成!

  <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"> </script>

使用相对Url无缝切换 HTTP HTTPS

在HTTPS的网站下,如果要访问HTTP资源,那么一般浏览器会弹出窗口询问用户是否允许加载不安全内容,云云。为了避免出现这样干扰用户的情况,所有网页下请求的资源都都必须是HTTPS资源。如果你的站点支...
  • bigsea622
  • bigsea622
  • 2016年03月02日 16:48
  • 3143

app实现动态切换测试环境和生产环境

原理很简单,就是将要切换的url存到本地,通过改变本地的url,每次开启网络请求的时候,从本地获取url,来达到动态切换环境的效果。 代码如下: package www.doolii.cn.envir...
  • lzq520210
  • lzq520210
  • 2016年05月27日 16:47
  • 2212

URL重定向使http访问转到https访问

apache环境下,配置好https后,需要设置url重定向规则,使网站页面的http访问都自动转到https访问,但有一个页面例外。 1、先打开url重定向支持 1)打开Apache/conf/...
  • happyqyt
  • happyqyt
  • 2013年07月31日 10:41
  • 26590

基于Spring boot,使用idea方便地切换启动环境

在真实项目开发的时候,一定会有多个环境,这里以开发环境和正式环境为例,使用Spring boot开发项目的时候,为了区别开发环境和正式环境,我们一般都需要为每一个环境专门写一个配置文件: ...
  • mate_ge
  • mate_ge
  • 2017年11月24日 14:49
  • 186

如何配置基于apache且用svn、http、https访问的SVN

  • 2013年08月12日 16:03
  • 24.2MB
  • 下载

非常方便地实现Window与Ubuntu共享文本字符串

非常方便地实现Window与Ubuntu共享受字符串 由于工作需要,我近来在Window 7下安装了 虚拟机,在虚拟机 里,安装Ubuntu 作开发。 基于使用上的习慢,Ubuntu只是用来作开...
  • RoadToTheExpert
  • RoadToTheExpert
  • 2015年07月22日 15:04
  • 290

classList详解,让你的js方便地操作DOM类

在此之前,jQuery的hasClass、addClass、removeClass我们已经再熟悉不过了,然而我们并不会在每一个项目中都会去使用jQuery或者Zepto,譬如在移动端的网页中,考虑到传...
  • cwzhsi
  • cwzhsi
  • 2016年01月16日 11:13
  • 868

方便地创建Mac App的iconset(附转换脚本)

自从Apple推出了Retina的MacBook Pro以后,给Mac App设计图标已成为比重越来越重要和有难度的一个活了——因为你需要准备1024x1024分辨率的图标! 当然这些是设计师的活,...
  • slinloss
  • slinloss
  • 2012年11月05日 10:15
  • 1653

【lizhi125】如何方便地自动每天备份自己的网站内容与数据库?

相信拥有自己网站或者博客的人应该都不少吧。网站数据备份的重要性我就不说了,对于新手或者懒人来说,大家都会遇到的问题就是“如何方便地自动每天备份自己的网站内容与数据库?” 首先,每天的手动备份不现实;...
  • lizhi125
  • lizhi125
  • 2012年06月26日 16:29
  • 553

Charles让你更方便的在Mac下抓取移动端http/https数据包(http://zhiqiangbuxi.cn/?p=281)

马上2016春节了博客也很久不更新了,但还是要坚持写一写,不管写的好不好,还是要坚持一下,可能若干年后回过头来看一看会哭笑不得,然后一拍大腿对着周围说一声:你看,我也年轻过。     今天主要说一下M...
  • u010008759
  • u010008759
  • 2017年04月27日 19:30
  • 700
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在Apache中方便地切换http和https?
举报原因:
原因补充:

(最多只允许输入30个字)