使用apache的mod_rewrite模块进行端口重写且保留特殊接口

作者: 2hei 发表于2010年1月 7日 14:35
版权声明: 可以转载, 转载时务必以超链形式标明文章原始出处和作者信息及版权声明
http://www.2hei.net/mt/2010/01/apache-mod-rewrite-http-to-https.html
需求如下:
网站的apache开通80和443端口,整站强制使用https,把所有80端口的访问转到443,新增需求为要针对某个接口单独开放80端口(80、443均可访问),剩下其他接口保持原有规则。


配置一、
RewriteRule !^/TestServlet http://%{SERVER_NAME}/$1 [L,R=301] 是有问题的,$1并没取得匹配的部分。

根据apache文档,使用否字符以反转匹配模式时,匹配模式中不能使用分组的通配成分。由于模式不匹配而使分组的内容是空的,所以它是不可能实现的。 因此,如果使用了否定式匹配模式,那么后继的字符串中就不能使用$N。

配置二、
RewriteRule !^/TestServlet - [L,R=301]   生效。

apache文档说明:'-'是一个特殊的替换串,意思是不替换。它可以用于仅仅匹配某些URL而无须替换的情况,比如,在发生替换前,允许以C(chain)标记连接的多个匹配模式同时起作用。


配置三、
    RewriteRule ^(.*)?$ https://%{SERVER_NAME}$1 [L,R=301]   原有将http重写为https的配置。
    所有访问http://2hei.net会转到https://2hei.net  

另外或许可行办法是配置apache的系统变量或者环境变量,凡是经过url重写的给变量一个特殊的标记,说明已经跳转,这样就不会出现循环跳转的现象了(没具体试过!)


实际中遇到的一个问题是apache进行url重写时,post方式提交的数据经过重写后数据会丢失,跳转后的url并没有收到post的数据,而访问跳转后的页面成了get方式。暴汗!

网上有人说使用 P参数,
RewriteRule ^(.*)?$ https://%{SERVER_NAME}$1 [L,R=301,P] ,实际试用了一下,纯属扯淡!

'proxy|P'(强制为代理)
此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。你必须确保此替换串是一个能够被mod_proxy处理的有效URI(比如以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。
注意:要使用这个功能,必须已经启用了mod_proxy模块。

| | Comments (0) | TrackBacks (0)

发表一个评论

关于这篇文章

这篇文章由2hei2010年1月 7日 14:35发布.

上一篇:8.8.8.8-google-public-dns-for-free

下一篇:[notice] child pid 19818 exit signal Bus error (7)

回到首页 或者查看归档文章