Apache:详解QSA,PT,L,E参数的作用

 [QSA]


当被替换的URI包含有query string的时候,apache的默认行为是,丢弃原有的query string 并直接使用新产生的query string,如果加上了[QSA]选项,那么旧的query string 将会与新产生的query string组合起来,产生一个新的query string 

Demo:

RewriteRule "/pages/(.+)" "/page.php?page=$1" [QSA]

当访问:/pages/123?one=two 

会重写成: /page.php?page=123&one=two

如果不用[QSA]

会重写成:/page.php?page=123

[PT]


RewriteRule中的目标串(被替换完的路径)都会被看做是文件路径,使用[PT]选项能够让apache将其看作是URI来对待。这也就是说,使用了[PT]选项,能够使得RewriteRule的结果重新加入到URL的匹配当中去,让那些基于本地匹配的,例如Alias, Redirect, or ScriptAlias,能够有生效的机会。

Demo:

Alias "/icons" "/usr/local/apache/icons"

RewriteRule "/pics/(.+)\.jpg$" "/icons/$1.gif" [PT]

如果你有一个Alias/icons,并且有一个RewriteRule,那么你需要使用[PT]选项来确保Alias会被计算到

如果漏了[PT]选项,那么会导致报出 'File not found' 的错误

[L]


[L]能够使得mod_rewrite 停止处理规则集。在众多contexts中,这意味着,一旦规则匹配了,就没有后续规则会被处理。这相当于Perllast命令,或者Cbreak命令。使用这个flag去指示当前规则应该立即应用,不用管后续的规则!

如果你也使用了RewriteRule .htaccess 或者在 <Directory> 中那么理解规则的处理过程是非常重要的。简单来说,一旦规则被处理,就会发起一个重写请求给URL解析引擎去重新处理这个url(译者注:就是重写的结果)。当这个重写请求被处理的时候,.htaccess  <Directory>就会被重新收集,因此规则集就会重新匹配。通常来说,如果一个规则导致重定向到-,无论是内部重定向还是外部重定向,都会让请求过程重新开始。

也是因为这个原因,如果你使用 RewriteRule 指令在某个context中,那么你要非常注意,防止闭环规则。并且不要单单关注有[L]flag那个结束执行一系列规则的那一条,还要理解整个流程。

有个可选的flag,[END],能够结束不单单是当前这一round的重写过程,还能阻止后续的重写过程。

Demo:

RewriteBase "/"

RewriteCond "%{REQUEST_URI}" "!=/index.php"

RewriteRule "^(.*)" "/index.php?req=$1" [L,PT]

上面的demo会重写所有请求到index.php,将原始请求作为一个query string参数给index.php,利用RewriteCond来确保如果当前请求已经是到index.php的,那么就跳过

 RewriteRule

[E]


通过[E],或者[env] flag,你可以设置环境变量。记住,有一些环境变量会在规则运行之后被设置,因此有可能会覆盖掉你设置的值。查看 the Environment Variables document 这个文档能够知道更多环境变量的运作。

完整的语法如下:

[E=VAR:VAL]

[E=!VAR]

Demo:

RewriteRule "\.(png|gif|jpg)$" "-" [E=image:1]

CustomLog "logs/access_log" combined env=!image

 

 

参考链接:http://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_l

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值