apache mod_rewrite是一个可以钻研得非常深的东西,但是你也可以非常简单的使用它。
下面我以几个例子来说明如何在apache中配置mod_rewrite
0.目录
1. 如何把 http://www.host.com/sample.php?city=bj&id=69632 这样的url用 http://www.host.com/s_bj_69632.html 这样的方式呈现给用户
2. 如何将 http://www.host123.com/ 域名的访问,全部定向到 http://www.host.com
3. 如何将 http://***.host.com/ 这样的地址根据不同的***,指向不同的路径
4. 如何调试你的配置
5. 如何设置apache作为代理服务器,这个和rewrite无关,但是有时候也会用到
1. 如何把 http://www.host.com/sample.php?city=bj&id=69632 这样的url用 http://www.host.com/s_bj_69632.html 这样的方式呈现给用户
<VirtualHost *>
...
RewriteEngine on # 这一行表示打开rewrite功能,当然需要apache安装了mod_rewrite
RewriteRule ^/s_(.*)_(.*).html /sample.php?city=$1&id=$2 [L]
# $1和$2分别表示正则表达式中匹配的内容
# [L]表示如果这条规则匹配成功了,就不再继续匹配下面的规则了,也就是说RewriteRule可以有多条,通常为了避免出错,建议大家都加上 [L] 标记
# 如果把[L]写成[R, L],那么,当用户在地址栏输入 http://www.host.com/s_bj_69632.html 这样的连接时,会自动跳转到 http://www.host.com/sample.php?city=bj&id=69632,这个根据具体的应用需求来定就可以了。...
</VirtualHost>
2. 如何将 http://www.host123.com/ 域名的访问,全部定向到 http://www.host.com
<VirtualHost *>
...
RewriteEngine on
RewriteRule ^/(.*) http://www.host.com/$1 [L,R,NE]
# NE表示对$1不要进行url编码。如果没有这个参数,会导致重复编码。
# 注意 rewrite不要求 www.host123.com 和 www.host.com 在同一台服务器...
</VirtualHost>
3. 如何将 http://***.host.com/ 这样的地址根据不同的***,指向不同的路径
<VirtualHost *>
...RewriteEngine on
RewriteMap lowercase int:tolower # 转化为小写
RewriteMap vdomain txt:/usr/local/etc/city.txt
# 设置映射的配置文件(格式:文件名),/usr/local/etc/city.txt文件内容见后面
# 当我们数据量比较小的时候,使用txt就可以了,如果数据量比较大了,可以使用dbm文件格式来提高效率RewriteCond %{SCRIPT_FILENAME} !^/cgi-bin/
# 为了安全,包含cgi-bin这样的url不进行处理RewriteCond ${lowercase:%{HTTP_HOST}} ^([^:]+)
#将域名转化为小写RewriteCond ${vdomain:%1} ^(.+)$
#在vdomain指定的文件中寻找对应值,后面用%1代表RewriteRule ^(.*)$ /%1/$1 [L,NE]
# %1 表示上面对应的路径...
</VirtualHost>/usr/local/etc/city.txt文件内容
bj /usr/local/apache/htdocs/city/010
sh /usr/local/apache/htdocs/city/021
gz /usr/local/apache/htdocs/city/020这样使用 http://bj.host.com 访问时,他实际的路径是 /usr/local/apache/htdocs/city/010 而不是 /usr/local/apache/htdocs 了
4. 如何调试你的配置
我们经常发现配置不能按预想的执行,但是又不只到错误在那里
在配置中增加两行记录logRewriteLog "/usr/local/apache/logs/rewrite.log"
# log文件名
RewriteLogLevel 1
# log级别,从0到9,0表示关闭log,数越大log越详细。同时对apache消耗越大,正式服务中应该关闭log。
5. 如何设置apache作为代理服务器,这个和rewrite无关,但是有时候也会用到
首先要apache安装mod_proxy
然后再配置中添加
ProxyPass /bj/ http://bj.host.com/
ProxyPassReverse /bj/ http://bj.host.com/
这样在用户访问 http://www.host.com/bj/ 时,就如同访问 http://bj.host.com/ 一样了。