利用mod_rewrite将动态网页转换为静态的网页 (2006年12月13日--9:31:15)
以数据库后台驱动的动态内容的网站,经常会遇到这些的问题:
  • 当在浏览器的地址栏输入一个无效的参数时,会出现数据库的错误提示,这是一个安全的隐患
  • 搜索引擎无法收录你的所有网页
  • 网页的链接地址是一系列的参数,对浏览用户和搜索引擎都不易理解
    /ul>
    这些问题都可以通过Apache服务器的一个基本的模块mod_rewrite来解决,默认的安装的Apache就会装有这个模块。要启用这个模块,打开httpd.conf文件,察看下面的两行是否被屏蔽,第一行是载入mod_rewrite模块,第二行是启用这个模块。
    LoadModule rewrite_module modules/mod_rewrite.so
    AddModule mod_rewrite.c
    mod_rewrite这个模块是如何工作的呢?
    mod_rewrite截获符合特定条件的URL,并按照设定的规则将它们改写成需要的URL。
    比如,可以将 http://www.mysite.com/product.php?pid=123312 这样的URL改写成
    http://www.mysite.com/product-123312.html 这样的静态URL,或者是更具体的 http://www.mysite.com/product/thinkpad-t42.html

    重写的规则
    重写的规则的表达式:
    RewriteRule 模式 替换 [选项]
    RewriteRule 是一个简单的命令告诉mod_rewrite这个模块如何去重写,关键的地方在于可以在模式和替换中使用正则表达式来匹配相应的字符,正则表达式的广泛的灵活性能将动态的URL转换成各式各样的符合要求的静态URL。看看这个重写规则:
    RewriteRule /products/([0-9]+)
    /fancy/products.php?id=$1
    当你在浏览器地址栏输入 http://www.mysite.com/product/123 时,这个地址被重写为 http://www.mysite.com/fancy/product.php?id=123
    这样,访问者就无法知道你的程序真正放在那个目录,程序的真正名字是什么,这也提高了网站的安全系数;这样的URL也去掉了?=这些字符,易于搜索引擎的机器人爬行你的网站。
    通过正则表达式,可以写出更复杂的重写规则:
    RewriteRule ^/products$ /content.php
    RewriteRule ^/products/([0-9]+)$ /content.php?id=$1
    RewriteRule ^/products/([0-9]+),([ad]*),([0-9]{0,3}),([0-9]*),([0-9]*$)
    重写规则的选项有
  • ‘forbidden’ 或 ‘f’ - 403 禁止
  • ‘gone’ 或 ‘g’ - 410 gone
  • ‘nocase’ 或 ‘NC’ - 大小写敏感
  • ‘next’/N’ - 回到第一条规则
  • ’skip=N’ 或 ‘S=N’ - 跳过下面的N条规则
流程控制
mod_rewrite是按照从上到下的顺序执行重写的规则,如果URL匹配了第一条规则,则按照第一条规则进行重写,如果不匹配,就执行第二条规则,直到最后。通过流程控制,可以定义在不同情况下采用不同的重写规则。格式是:
RewriteCond 测试条件 Condition
这些测试条件有:
  • HTTP变量: HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_FORWARDED, HTTP_HOST, HTTP_PROXY_CONNECTION, HTTP_ACCEPT
  • 连结和请求的变量: REMOTE_ADDR, REMOTE_HOST, REMOTE_USER, REMOTE_IDENT, REQUEST_METHOD, SCRIPT_FILENAME, PATH_INFO, QUERY_STRING, AUTH_TYPE
  • 服务器内部变量: DOCUMENT_ROOT, SERVER_ADMIN, SERVER_NAME, SERVER_ADDR, SERVER_PORT, SERVER_PROTOCOL, SERVER_SOFTWARE
  • 系统变量: TIME_YEAR, TIME_MON, TIME_DAY, TIME_HOUR, TIME_MIN, TIME_SEC, TIME_WDAY, TIME
  • mod_rewrite特殊值: API_VERSION, THE_REQUEST, REQUEST_URI,
例如,利用mod_rewrite可以禁止从其他的网站链接到你的图片:
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://localhost/.*$ [OR,NC]
RewriteCond %{HTTP_REFERER} !^http://mysite.com/.*$ [OR,NC]
RewriteCond %{HTTP_REFERER} !^http://www.mysite.com/.*$ [OR,NC]
RewriteRule .*\.(gif|GIF|jpg|JPG)$ http://mysite/images/bad.gif [L,R]