一,Rewrite重写时带“?”(问号)参数的传递


很多人都会遇到需要将网站以前的旧URL转换到新版本的新URL来,但是有一些带有参数的地址由于涉及到参数名的变更,需要通过伪静态的方式实现跳转。但Apache和Ngnix的方法是不支持带参数的URL地址重写的(即:RewriteRule不会去匹配“?”后面的字符串的,需要用RewriteCond来匹配)。

  

例如:把 /abc?id=123 重定向到 /def.php?id=123 的写法:

方式一:

RewriteEngine on

RewriteBase /

RewriteCond %{QUERY_STRING} ^id=(.+)$

RewriteRule ^/abc$ /def.php?sid=%1 [L]

#注释1:RewriteCond %{QUERY_STRING} ^id=(.+)$ ,得到url中的变量,并通过“%N”的方式获取(参数名可以重写,而且参数值可以匹配)

#注释2:RewriteCond 里面需要提取的值可以用 %N 进行反向引用值,而RewriteRule里面还是需要用$N的来反向引用值


方式二:

RewriteEngine on

RewriteBase /

RewriteRule ^/abc$ /def.php [L,QSA]

#注释1:[QSA]表示保留重写url时“?”后面的参数(但参数名不可以重写,只会原样的保留)


官方文档解释(查询字符串):

Pattern不会按照查询字符串进行匹配。为了达到这个目的,你必须使用一个带有% {QUERY_STRING}变量的RewriteCond指令。当然,你也可以在替换字符串中创建包含查询字符串的URL:在替换字符串串中使用问号,以标明其后的部分应该被重新注入到QUERY_STRING中。而要删除一个已有的请求串,则可以用问号来终结替换字符串。为了联新旧查询字符串,请使用[QSA]标志。


二、apache rewrite 终结篇:apache %{QUERY_STRING}

1.$n取得第n个参数值

RewriteRule ^sss/(.*)/(.*)$ zdz/index.php?arg1=$1&arg2=$2


2.query_string(%{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参数。


eg.1

如果 http://127.0.0.1/rewrite/jeecn.zdz?par=helloforbworld 中的 query_string 包含字符串forb ,则禁止访问

RewriteCond %{QUERY_STRING} forb

RewriteRule ^(.*)\.(.*)$ preg.php?%{QUERY_STRING} [F]


eg.2

通过[QSA]标志保留原有URL参数的同时,在后面加新的URL参数:param=value

RewriteRule ^/page /page?param=value [QSA]


eg3.

当URL参数包含字符串parm时

将URL:http://www.gphqgb.com/ask?param=value 重写为: http://www.gphqgb.com/answer?param=value

RewriteCond %{QUERY_STRING} parm

RewriteRule ^/ask /answer


eg4.%n反向引用

1)当访问 /path 时,将字符串 parm修改为 showparm

RewriteCond %{QUERY_STRING} ^(.*)parm(.*)$

RewriteRule /path /path?%1showparm%2

上面的%1和%2是反向引用,来自之前的RewriteCond中正则表达式的匹配结果


2)将http://www.gphqgb.com/path?key=value 转换为: http://www.gphqgb.com/path/key/value

RewriteCond %{QUERY_STRING} ^(\w+)=(\w+)$

RewriteRule ^/path /path/%1/%2?


© 著作权归作者所有,未经允许《url Rewrite 重写时带“?”(问号)参数的传递》不得转载

相关文章

最新文章

热门文章

热门TAG