Apache中重写URL参数(Query String)
URL参数(Query String)是URL里面“?”后面的部分,它通常用于传输参数给CGI脚本或者其它动态页面。在Apache中,该值存储在环境变量QUERY_STRING中(在PHP中,可以通过$_SERVER['QUERY_STRING']访问到)。
在Apache中,大多对URL进行操作的指令,如、Redirect、Alias和RewriteRule,都不能直接访问该数据;不过,mod_rewrite模块却可以对URL参数进行添加、删除和修改。其中的关键就是使用RewriteCond来匹配%{QUERY_STRING}变量,如果需要的话,还可以使用[QSA]标志来附加URL参数。
下面是一些例子。这些例子是放在Apache的配置文件中的服务器配置里,如果需要放到区或.htaccess里面,RewriteRule应做相应的修改。此外,这些例子也可通过在RewriteRule规则后加上[R]标志,从“内部别名方式(Alias)”变成“外部跳转方式(Redirect)”。
通过URL参数进行访问控制
如果 http://example.com/page?var=val 中的 var=val 包含字符串 foo ,则禁止访问。
1.RewriteCond %{QUERY_STRING} foo
2.RewriteRule ^/page - [F]
删除URL参数
将URL参数直接从URL中删除。
1.RewriteRule ^/page /page?
增加URL参数
通过[QSA]标志保留原有URL参数的同时,在后面增加新的URL参数:var=val。
1.RewriteRule ^/page /page?var=val [QSA]
重写某些URL参数
当URL参数包含字符串val时,将URL:http://example.com/page1?var=val 重写为: http://example.com/page2?var=val 。
1.RewriteCond %{QUERY_STRING} val
2.RewriteRule ^/page1 /page2
注意,在这里如果你不修改URL参数的话,不需要使用[QSA]标志,原来的URL参数是默认附加的。
修改URL参数
当访问 /path 时,将字符串 val 修改为 other_val 。
1.RewriteCond %{QUERY_STRING} ^(.*)val(.*)$
2.RewriteRule /path /path?%1other_val%2
上面的%1和%2是反向引用,来自之前的RewriteCond中正则表达式的匹配结果。
将URL参数转换为路径
将URL:http://example.com/path?var=val 转换为: http://example.com/path/var/val 。
1.RewriteCond %{QUERY_STRING} ^(\w+)=(\w+)$
2.RewriteRule ^/path /path/%1/%2?
注意上面的转换仅用于单一的 var=val 参数,且其中只能包含字母、数字和下划线。
将路径转换为URL参数
这是上面的转换的反向操作。这个例子可以转换有效的任意三级路径的URL: http://example.com/path/var/val 将转换为 http://example.com/path?var=val 。
1.RewriteRule ^/path/([^/]+)/([^/]+) /path?$1=$2
关于路径转换可以参考重写路径信息(PathInfo)。