🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## mod_alias模块 这个模块即可以完成别名定义,也可以处理URL请求。 ### 别名定义 * Alias 将URL映射到定义的目录或文件上 * AliasMatch 使用正则表达式定义 * ScriptAlias 定义一个目录为CGI容器 * ScriptAliasMatch 使用正则表达式定义 ### 重定向定义 Redirect permanent /download http://www.abc.com/download * pernanent 状态码301 表示永久移动 * temp 状态码302 表示找到资源,默认 * seeother 状态代码303 资源位置被替换 * gone 状态代码410 表示资源已经不存在 * RedirectPermanent 表示 Redirect permanent * RedirectTemp 表示 Redirect temp ## mod_rewrite模块 ### 工作流程 ![](http://om4h63cja.bkt.clouddn.com/17-6-7/46192127.jpg) ### 重写指令 * RewriteEngine指令 参数为on或者off,设置是否启用或者禁止模块 * RewriteRule指令 语法格式 ~~~ RewriteRule Pattern Substitution [flags] ~~~ #### Pattern 为当前请求的URL正则表达式,这个URL可能被RewriteRule规则或者alias指令修改过。使用“!”求反操作,不能使用匹配模式中的分组通配。 #### Substitution 参数是当原始URL与Pattern匹配时,用来替换的字符串。 * 对Pattern中的分组可以使用$N进行反向引用。 * 对RewriteCond中的分组可以使用%N进行反向引用。 * 规则条件测试字符串%{VARNAME}中的服务器变量 * 映射函数调用${mapname:key|default},用户可以通过${mapname:key|default}的形式来调用RewriteMap定义的映射。 * “-”作用是不做任何处理 1 重写到文件系统的路径 ~~~ RewriteRule "^/games" "/usr/local/games/web" ~~~ 2 重写到DocumentRoot目录下的路径 ~~~ RewriteRule "^/foo$" "/bar" ~~~ 3 重写到完整的URL ~~~ RewriteRule "^/product/view$" "http://site2.example.com/seeproduct.html" [R] ~~~ #### flags * last|L 结尾规则 这个标记用于阻止当前已被重写的URL被后继规则再次重写 * proxy|P 强制为代理 此标记使替换成分被内部地强制作为代理请求发送,并立即中断重写处理,然后把处理移交给mod_proxy模块。替换串是一个能够被mod_proxy处理的有效URI(比如以http://hostname开头)。可以把某些远程成分映射到本地服务器域名空间,从而增强了ProxyPass指令的功能。注意:要使用这个功能,必须已经启用了mod_proxy模块。 * redirect|R[=code] 强制外部重定向 * forbidden|F 强制禁止当前URL响应,并像客户端发送一个403httpd响应代码 * gone|G 强制废弃当前URL,并像客户端发送一个410 httpd响应代码 * nocase|NC 忽略pattern中的大小写 * redirect|R [code] 将重写的URL作为重定向处理,默认是302 * next|N 从头再来 重新执行重写操作(从第一个规则重新开始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。它对应于Perl中的next命令或C语言中的continue命令。此标记可以重新开始重写操作(立即回到循环的开头)。但是要小心,不要制造死循环! * noescape|NE 在输出中不对URI进行转义 此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。一般情况下,特殊字符('%', '$', ';'等)会被转义为等值的十六进制编码('%25', '%24', '%3B'等)。 * chain|C 链接下一规则 此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除".www"(此处不应该出现".www")。 * passthrough|PT 移交给下一个处理器 此标记强制重写引擎将内部request_rec结构中的uri字段设置为filename字段的值,使得RewriteRule指令的输出能够被(从URI转换到文件名的)Alias, ScriptAlias, Redirect等指令进行后续处理。 举一个能说明其含义的例子:如果要将/abc重写为/def,然后再使用mod_alias将/def转换为/ghi,可以这样: ``` RewriteRule ^/abc(.*) /def$1 [PT] Alias /def /ghi ``` 如果省略了PT标记,虽然将uri=/abc/...重写为filename=/def/...的部分运作正常,但是后续的mod_alias在试图将URI转换到文件名时会遭遇失效。 注意:如果需要混合使用多个将URI转换到文件名的模块时,就必须使用这个标记。。此处混合使用mod_alias和mod_rewrite就是个典型的例子。 ~~~ Alias /icons /usr/local/apache/icons RewriteRule /pics/(.+).jpg /icons/$1.gif [PT] ~~~ 当请求/pics/下的图片文件时, 实际是返回的是 /icons/目录下的同名文件. 需要注意的是一定要设置 [PT] 标志. 否则Alias设置无效. ### RewriteCond RewriteCond用来定义重写条件 ~~~ RewriteCond TestString CondPattern ~~~ * 对RewriteRule中的分组可以使用$N进行反向引用。 * 对RewriteCond中的分组可以使用%N进行反向引用。 * 服务器变量 ![](http://om4h63cja.bkt.clouddn.com/17-6-7/84803184.jpg) #### CondPattern * < CondPattern 将CondPattern视为纯字符串,与teststring按字典顺序进行比较,teststring小于CondPattern为真 * \> CondPattern 将CondPattern视为纯字符串,与teststring按字典顺序进行比较,teststring大于CondPattern为真 * = CondPattern 将CondPattern视为纯字符串,与teststring按字典顺序进行比较,teststring等于CondPattern为真 * -d 将teststring视为路径名并测试是否为一个存在的目录 * -f 将teststring视为路径名并测试是否为一个存在的常规文件 * -s 将teststring视为路径名并测试是否为一个存在的切大于0的常规文件 * -l 将teststring视为路径名并测试是否为一个存在的常规文件 * -f 将teststring视为路径名并测试是否为一个存在的符号链接 * -x 将teststring视为路径名并测试是否为一个存在的可执行文件 * -F 检查teststring是否为有效的文件 * -U检查tesstring是否为有效的URL nocase|NC 忽略大小写 ornext|OR 多个条件或者关系 ### RewriteBase 在目录重写中,只要请求的URL不能与本地的文件系统匹配时,就需要每个目录设置一个重写的基准URL,