查询字符串是指URL请求中“问号”后面的部分。比如,http://mysite/?foo=bar

中粗体部分就是查询字符串,其中变量名是foo,值是bar。

'last|L' (最后一个规则 last)

立 即停止重写操作,并不再应用其他重写规则。

它对应于Perl中的last命令或C语言中的break命令。这个标记可以阻止当前已被重写的URL为其后继的规则所重写。

举例,使用它可以重写根路径的URL('/')为实际存在的URL, 比如, '/e/www/'.

'qsappend|QSA' (追加请求串 query string append)

此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。 如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。

1. 利用QSA转换查询字符串QUERY_STRING


QSA标志( Query String Appending)用于在URI中截取查询字符串,这个截取操作是通过小括号正则表达式实现的:

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

将会把请求/pages/123?one=two映射到 /page.php?page=123&one=two

注意粗体部分几乎是相同的,除了“问号”变成了“与”符号

如果没有QSA标志,那么会映射到/page.php?page=123。

如果没有用到小括号正则表达式,就不需要QSA,这在上面一个小节中已经例证过了。

小括号正则表达式可以截取查询字符串中的内容,但是如果没有开启QSA标志,那么在/page.php?page=$1中“问号”之后将会被剥离丢弃。

这种特性可以用于实现“剥离查询字符串”

通过QSA,我们可以将简单链接/simple/flat/link/ 映射成 server-side.php?first-var=flat&second-var=link

RewriteEngine On
RewriteRule ^/([^/]+)/([^/]+)/? /index.php?first-var=$1&second-var=$2 [QSA]

2. 利用RewriteCond改写查询字符串QUERY_STRING


RewriteEngine On
RewriteCond %{QUERY_STRING} foo=(.*)
RewriteRule ^grab(.*) /page.php?bar=%1

该规则将访问请求http://mysite/grab?foo=bar转换为http://mysite/page.php?bar=bar

RewriteCond用于捕获查询字符串(QUERY_STRING)中变量foo的值,并存储在%1

QUERY_STRING是Apache定义的“变量=值”向量(数组)

3. QSA与RewriteCond双剑齐发


RewriteEngine On
RewriteCond %{QUERY_STRING} foo=(.+)
RewriteRule ^grab/(.*) /%1/index.php?file=$1 [QSA]

会把/grab/foobar.zip?level=5&foo=bar映射到 /bar/index.php?file=foobar.zip&level=5&foo=bar

转换后根目录是bar目录

foobar.zip?level=5中的“问号”变成了foobar.zip&level=5中的“与”符号

4. 剥离查询字符串


只需在要开始剥离的链接后面加个“问号”,并且不要启用QSA标志,就可剥离查询字符串。

RewriteEngine On
# Whatever QS is
RewriteCond %{QUERY_STRING} .
# I don't want it with Question mark
RewriteRule foo.php(.*) /foo.php? [L]

最新文章

  1. potrace源码分析一
  2. JAVA异常处理机制的简单原理和应用
  3. nyoj130 相同的雪花
  4. Ubuntu下VIM的安装及其配置——Linux篇
  5. map,hash_map和unordered_map 实现比较
  6. Oracle 中 union与union all
  7. 实现ios屏幕的横竖屏自适应
  8. 傻瓜式破解linux--rootpassword
  9. Service Activity三种交互方式
  10. OpenGl编程指南第7版(红宝书)环境配制
  11. 小谈SQL表的连接
  12. linux系统中的时间
  13. stark组件开发之排序
  14. (转) AI突破性论文及代码实现汇总
  15. Uva LA 3902 - Network 树形DP 难度: 0
  16. C/C++基础----类
  17. js多条件if语句简写发生Uncaught SyntaxError: Unexpected token }
  18. SpringCloud学习:Eureka、Ribbon和Feign
  19. oracle11g本地可以访问但局域网无法访问
  20. 20155335俞昆《java程序设计》第6周总结

热门文章

  1. C# 实现敏感词过滤
  2. Celery 异步队列
  3. animations与transition
  4. SAP S4HANA 使用BP创建供应商报错 - You cannot create a vendor with grouping G001 - 对策
  5. wpf 打开win8系统软件盘
  6. system execl
  7. getopt、getopt_long命令参数
  8. ZigBee究竟是什么?有什么用?
  9. 10.Redis 主从架构
  10. 【Spring Boot】Spring Boot之使用ImportBeanDefinitionRegistrar类实现动态注册Bean