• 改写URL的查询字符串QUERY_STRING

    WordPress的静态链接实现
    服务器君一共花费 188.710 ms 进行了 3 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    查询字符串是指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)。它可以在动态与静态中切换,其实它不高深,用的就是本小节所讲到的方法。
更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [JavaScript程序设计] 关于HTTP Keep-Alive 6 个条目
  2. [数据库技术] 数据库范式篇 5 个条目
  3. [软件工程与项目管理] 开始了解Git 5 个条目
  4. [PHP程序设计] fsockopen,curl与file_get_contents 12 个条目
  5. [移动开发] 简单了解Android Fragment 3 个条目
  6. [智力开发与知识管理] 整体性学习步骤 9 个条目
  7. [移动开发] 使用support-v7 ActionBar前的那些坑 3 个条目
  8. [搜索引擎优化] 百度搜索引擎优化指南 3 个条目
  9. [移动开发] Android根基概念Context 8 个条目
  10. [Python程序设计] Django数据库模型 6 个条目
  11. [移动开发] Android属性系统Property 9 个条目
  12. [Python程序设计] 从PHP到Python 3 个条目
窗口 -- [协会]