当前位置: 首页 > OpenSource > 正文

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

需求如下:
网站的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模块。

本文固定链接: http://2hei.net/apache_mod_rewrite_http_to_https.html | 2hei's site

该日志由 2hei 于2010年01月07日发表在 OpenSource 分类下,
原创文章转载请注明: 使用apache的mod_rewrite模块进行端口重写且保留特殊接口 | 2hei's site

报歉!评论已关闭.