一,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://piaoyun.io/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://jeecn.com/ask?param=value 重写为: http://jeecn.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://jeecn.com/path?key=value 转换为: http://piaoyun.io/path/key/value RewriteCond %{QUERY_STRING} ^(\w+)=(\w+)$ RewriteRule ^/path /path/%1/%2?
文章版权声明:除非注明,否则均为我爱教程术原创文章,转载或复制请以超链接形式并注明出处。