一. 简单实例介绍
通常来讲,apache配置好http和https后,若是想要作http强转到https,须要设置url重定向规则,大体须要下面几个步骤便可完成配置:html
1)在httpd.conf文件里使下面模块生效 [root@back ~]# cat /usr/local/apache/conf/httpd.conf ..... LoadModule ssl_module modules/mod_ssl.so #若是使用https证书,这个模块功能必定要打开! ..... LoadModule rewrite_module modules/mod_rewrite.so #若是要http强转到https,这个模块功能必定要打开! 2)httpd.conf配置文件或者是在httpd-vhost.conf文件里修改 [root@back ~]# cat /usr/local/apache/conf/httpd.conf ....... DocumentRoot "/data/vhosts" <Directory "/data/vhosts"> Options FollowSymLinks MultiViews Includes AllowOverride All Require all granted </Directory> 3)在网站根目录下面添加该文件".htaccess"目录访问控制文件,并添加以下内容: RewriteEngine on RewriteBase / RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R] 含义是这样的:为了让用户访问传统的http://转到https://上来,用了一下rewrite规则: 第一句:启动rewrite引擎 第三句:rewrite的条件是访问的服务器端口不是443端口 第四句:这是正则表达式,^是开头,$是结束,/?表示有没有/均可以(0或1个),(.*)是任何数量的任意字符 整句的意思是讲:启动rewrite模块,将全部访问非443端口的域名请求,url地址内容不变,将http://变成https://。
上面的配置实现了将全部域名的http跳转为https,若是只是针对某一个具体的url的https跳转,则配置状况会有所不一样,以下:web
只要求访问http://bo.kevin.com/beijing/ 时强制跳转到https://bo.kevin.com/beijing/,其余的url访问时都不作http到https的强转! 在.htaccess文件中添加下面内容: [root@docker-test2 web]# cat .htaccess <IfModule mod_rewrite.c> RewriteEngine on RewriteBase / RewriteCond %{SERVER_PORT} 80 RewriteCond %{HTTP_HOST} ^bo.kevin.com/beijing/ [NC] RewriteRule ^(.*)$ https://bo.kevin.com/beijing/ [R,L] </IfModule> 上面的配置,就实现了只是针对http://bo.kevin.com/beijing/这一个单独的url作https的强制跳转,其余url访问时都不作跳转!
固然,除了上面的方法,还有其余的配置能够实现,好比经过匹配目录规则实现跳转需求,下面都会介绍到.正则表达式
二. Apache中 RewriteRule跳转规则参数
docker
Apache模块mod_rewrite提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每一个完整规则能够拥有不限数量的子规则以及附加条件规则的灵活并且强大的URL操做机制。此URL操做能够依赖于各类测试,好比服务器变量、环境变量、HTTP头、时间标记,甚至各类格式的用于匹配URL组成部分的查找数据库。数据库
mod_rewrite模块能够操做URL的全部部分(包括路径信息部分),在服务器级的(httpd.conf)和目录级的(.htaccess)配置都有效,还能够生成最终请求字符串。此重写操做的结果能够是内部子处理,也能够是外部请求的转向,甚至还能够是内部代理处理。apache
如下重点介绍下RewriteRule 的规则以及参数说明。RewriteRule指令是重写引擎的根本。此指令能够屡次使用。每一个指令定义一个简单的重写规则。这些规则的定义顺序尤其重要——在运行时,规则是按这个顺序逐一辈子效的。安全
配置格式:
RewriteRule Pattern Substitution [flags]服务器
1) Pattern是一个做用于当前URL的perl兼容的正则表达式。
"当前URL"是指该规则生效时刻的URL的值。它可能与被请求的URL大相径庭,由于其余规则可能在此以前已经发生匹配并对它作了改动。cookie
2) Substitution是当原始URL与Pattern相匹配时,用来替代(或替换)的字符串。除了纯文本,还能够包含:
- 对Pattern的反向引用($N)
- 对最后匹配的RewriteCond的反向引用(%N)
- 规则条件测试字符串(%{VARNAME})中的服务器变量
- 映射函数调用(${mapname:key|default})dom
3) [flags]标记做为RewriteRule指令的第三个参数,是一个包含以逗号分隔的下列标记的列表:
3.1) ‘chain|C‘(连接下一规则)
此标记使当前规则与下一个规则相连接。它产生这样的效果:
若是一个规则被匹配,则继续处理其后继规则,也就是这个标记不起做用;
若是该规则不被匹配,则其后继规则将被跳过。
好比:
在一个目录级规则中执行一个外部重定向时,你可能须要删除".www"(此处不该该出现".www")。
‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]‘(设置cookie):在客户端设置一个cookie。cookie的名称是NAME,值是VAL。
domain是该cookie的域,好比‘.apache.org‘,可选的lifetime是cookie的有效期(分钟),可选的path是cookie的路径。
3.2) ‘env|E=VAR:VAL‘(设置环境变量)
此标记将环境变量VAR的值设为VAL,VAL能够包含可扩展的正则表达式反向引用($N和%N)。此标记能够屡次使用以设置多个变量。
这些变量能够在其后许多状况下被间接引用,一般是在XSSI(<!--#echo var="VAR"-->)或CGI($ENV{‘VAR‘})中,也能够在后继的
RewriteCond指令的CondPattern参数中经过%{ENV:VAR}引用。使用它能够记住从URL中剥离的信息。
3.3) ‘forbidden|F‘(强制禁止URL)
强制禁止当前URL,也就是当即反馈一个HTTP响应码403(被禁止的)。使用这个标记,能够连接若干个RewriteConds来有条件地阻塞某些URL。
3.4) ‘gone|G‘(强制废弃URL)
强制当前URL为已废弃,也就是当即反馈一个HTTP响应码410(已废弃的)。使用这个标记,能够标明页面已经被废弃而不存在了。
3.5) ‘handler|H=Content-handler‘(强制指定内容处理器)
强自制定目标文件的内容处理器为Content-handler。例如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射文件夹内的全部文件都
由"cgi-script"处理器处理。
3.6) ‘last|L‘(结尾规则)
当即中止重写操做,并再也不应用其余重写规则。它对应于Perl中的last命令或C语言中的break命令。
这个标记用于阻止当前已被重写的URL被后继规则再次重写。例如,使用它能够重写根路径的URL(‘/‘)为实际存在的URL(好比:‘/e/www/‘)。
3.7) ‘next|N‘(从头再来)
从新执行重写操做(从第一个规则从新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。
它对应于Perl中的next命令或C语言中的continue命令。此标记能够从新开始重写操做(当即回到循环的开头)。可是要当心,不要制造死循环!
3.8) ‘nocase|NC‘(忽略大小写)
它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,‘A-Z‘和‘a-z‘没有区别。
3.9) ‘noescape|NE‘(在输出中不对URI进行转义)
此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 通常状况下,特殊字符(‘%‘, ‘$‘, ‘;‘等)会被转义为等值的十六进制编码(‘%25‘, ‘%24‘, ‘%3B‘等)。
此标记能够阻止这样的转义,以容许百分号等符号出如今输出中,好比:RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] ,可使‘/foo/zed转向到一个安全的请求‘/bar?arg=P1=zed‘。
3.10) ‘nosubreq|NS‘(不对内部子请求进行处理)
在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。好比,在mod_include试图搜索目录默认文件(index.xxx)时,Apache会在内部产生子请求。对于子请求,重写规则不必定有用,并且若是整个规则集都起做用,它甚至可能会引起错误。因此,能够用这个标记来排除某些规则。
使用原则:若是你为URL添加了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)很高,在这种状况下,可使用这个标记。
3.11) ‘proxy|P‘(强制为代理)
此标记使替换成分被内部地强制做为代理请求发送,并当即中断重写处理,而后把处理移交给mod_proxy模块。
你必须确保此替换串是一个可以被mod_proxy处理的有效URI(好比以http://hostname开头),不然将获得一个代理模块返回的错误。
使用这个标记,能够把某些远程成分映射到本地服务器域名空间,从而加强了ProxyPass指令的功能。
注意:要使用这个功能,必须已经启用了mod_proxy模块。