查询字符串是指URL
请求中“问号”后面的部分。比如,http://www.nowamagic.net/?foo=bar
中粗体部分就是查询字符串,其中变量名是foo
,值是bar
。
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]
WordPress
里的静态链接,有印象吗?这是Wordpress
配合Mod Rewrite
模块和.htaccess
文件一起实现的,即所谓的固定链接(Permalinks
)。它可以在动态与静态中切换,其实它不高深,用的就是本小节所讲到的方法。