还是跟HTTPS相关,因为HTTPS导致系统很慢,频繁崩溃,于是,领导想了个招:能否设置让HTTPS 自动跳转为 HTTP。
网上一查,是可以的。 使用Apache的 rewrite_module模块。
再从网上信手找来几条 rewrite_module 的指令,一配置,嘿,还真跳转了。幸福来得那么容易!但当出现问题时,却是头痛和怀疑不已,哪里错了,哪里不对,是不是HTTPS自动跳转为HTTP不对。这个时候,才在被逼的情况下,耐着性子去查一条条指令的具体用法。
rewrite_module 指令的参考文档(http://httpd.apache.org/docs/current/mod/mod_rewrite.html)。
Apache配置rewrite_module 的方法:
1、取消注释:LoadModule rewrite_module (在Apache的配置文件apache.conf中)
2、.在<VirtualHost>内写下列指令(因是HTTPS自动跳转为HTTP,故在SSL配置文件 ssl.conf 中配置)注意指令中需要空格的地方一定要空格。
RewriteEngine On #:此处是开关,一定要设置为On;当不需要进行跳转时,可直接设置该指令为Off,而不需要注释掉每行rewrite指令。
RewriteLogLevel 3 #:日志记录级别,为0至8之间。当为0时,表示不记录;
#:参考中说若不是为了调试用,该值不要设置超过2,因为值过大,会比较影响系统性能。
RewriteLog "D:\www\logs\rewrite.log" #:日志记录的目录
RewriteCond %{HTTP_HOST} !127.0.0.1
RewriteCond %{SERVER_PORT} 443
RewriteRule ^/(.*)$ http://%{SERVER_NAME}/$1 [NE]
#:RewriteCond:定义rewriting会发生的条件,可以有多个。可以用“!” 表示取反。多个 RewriteCond 默认是AND;也可使用[OR]修改各个条件间的关系。
#:RewriteRule:定义rewrite的规则,可以有多个。格式为:Pattern Substitution [flags]
该指令中第一个参数为:正则表达式形式的条件;
第二个参数为:满足条件时,跳转的地址;
在<VirtualHost>中,表示 hostname、port 之后、query string 之前的部分。
例如 https://127.0.0.1:443/www/index.php?a=123&b=456 中,第二个参数的值应该是/www/index.php
其中会用到“$N ”(N为>=0 的正整数)
N=0 与 N!=0 的区别:以表达式 RewriteRule ^/(.*)$ http://%{SERVER_NAME}/$1 为例
$0 表示替换满足第二个参数Pattern 中的所有部分;如 /www/index.php
$1 表示替换满足第二个参数Pattern 中的“()”括号内的部分;如 www/index.php
两者的区别是:$1 未包括Pattern 的括号外的“/”
第三个参数,参数以“[ ]”包括,各个参数间以“,”分隔。这里详细学习了几个FLAG。
[L] LAST 当本条RewriteRule中的条件满足时,只执行本条RewriteRule,不再执行其他的RewriteRule。
注意大条件:当本条RewriteRule中的条件满足时。
在日志文件中,有[L]和无[L]的区别如下图:无[L]时,会再次匹配RewriteRule
[R] REDIRECT 显式的强制重定向HTTP。有[R]和无[R]的区别如下:
日志中会出现“implicitly forcing redirect (rc=302) with” 的原因 ,查mod_rewrite.c可知,当rewrite 后的地址为URL时,将进行隐式的强制跳转。
当设置了标识[R]时,将进行显示的强制跳转。
[NE] Not Escape 不对特殊字符进行转义,当不设置该参数时,在log中能看到这样的记录:
其他指令:RewriteBase 定义rewrite的目录范围
使用rewrite_module 进行跳转后,浏览器第一次返回 FOUND 302 的结果,表示临时性跳转;接着浏览器会自动再继续跳转,返回 200 实现URL的正常跳转。
也就是说,使用rewrite_mode 时,浏览器会自动进行两次动作,一次是实现地址的转换,另一次是实现地址的跳转。
RewriteCond 和 RewriteRule 的执行顺序:先执行 RewriteRule,再去查看是否满足 RewriteCond 的条件。 该点是从log中看出的: