使用%{QUERY_STRING}中的一些(但不是全部)值将Mod_Rewrite转换为新URL

时间:2014-09-18 08:50:22

标签: .htaccess mod-rewrite

由于我们的产品已经从一个编码框架切换到另一个编码框架,我们需要修改旧的第三方的一些回调URL以实现向后兼容。基本上以下两个应该有效:

/oldLms/index.php?r=controller/action&code=randomCode
/lms/?r=site/newEndpoint&code=randomCode

旧的oldLms目录现在不存在。这就是为什么我们需要htaccess将请求从第一个转发到第二个。

重要点如下:

  1. code查询参数应作为查询参数传递给新网址。
  2. r查询参数应该,因为我们已经将新的r硬编码为将处理新逻辑的目标。传递旧的r(在这种情况下是控制器/动作)会使新框架混淆为认为我们正在请求别的东西。
  3. 这就是我们现在所处的位置:

    RewriteCond %{QUERY_STRING} (^|&)r=controller/action(&|$) [NC]
    RewriteCond %{QUERY_STRING} (^|&)code=(.*)(&|$) [NC]
    RewriteRule ^oldLms/(.*) /lms/?r=site/newEndpoint&code=$4 [L,NC,QSA,R=302]
    

    但是,这似乎不起作用,因为$4不会从原始网址返回code查询字符串参数的值。

1 个答案:

答案 0 :(得分:0)

自我回答:

RewriteCond %{QUERY_STRING} (^|&)r=controller/action(&|$) [NC]
RewriteCond %{QUERY_STRING} (^|&)code=(.*)(&|$) [NC]
RewriteRule ^oldLms/(.*) /lms/?r=site/newEndpoint&code=%2 [L,NC,R=302]
  1. 删除[QSA],因为它会将完整的查询字符串附加到转发的网址(包括r参数)。
  2. 在替换网址中使用%number代替$number来从查询字符串而不是原始网址中定位选择器。
  3. 此外,在这种情况下,它必须是%2而不是%4