IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    usity发表于 2017-03-27 11:36:53
    love 0

    一,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://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://jeecn.com/path/key/value
    RewriteCond %{QUERY_STRING} ^(\w+)=(\w+)$
    RewriteRule ^/path /path/%1/%2?

     



沪ICP备19023445号-2号
友情链接