查询字符串是指URL请求中“问号”后头的部门。好比,?foo=bar中粗体部门就是查询字符串,个中变量名是foo,值是bar。
1. 操作QSA转换查询字符串QUERY_STRING
QSA符号( Query String Appending)用于在URI中截取查询字符串,这个截取操纵是通过小括号正则表达式实现的:
1
RewriteEngine On
2
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
1
RewriteEngine On
2
RewriteRule ^/([^/]+)/([^/]+)/? /index.php?first-var=$1&second-var=$2 [QSA]
2. 操作RewriteCond改写查询字符串QUERY_STRING
1
RewriteEngine On
2
RewriteCond %{QUERY_STRING} foo=(.*)
3
RewriteRule ^grab(.*) /page.php?bar=%1
该法则将会见请求grab?foo=bar转换为page.php?bar=bar
RewriteCond用于捕捉查询字符串(QUERY_STRING)中变量foo的值,并存储在%1中
QUERY_STRING是Apache界说的“变量=值”向量(数组)
3. QSA与RewriteCond双剑齐发
1
RewriteEngine On
2
RewriteCond %{QUERY_STRING} foo=(.+)
3
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符号,就可剥离查询字符串。
1
RewriteEngine On
2
# Whatever QS is
3
RewriteCond %{QUERY_STRING} .
4
# I don't want it with Question mark
5
RewriteRule foo.php(.*) /foo.php? [L]