Double Colon在RewriteCond中做了什么?

时间:2016-06-03 02:53:48

标签: .htaccess mod-rewrite

示例:

RewriteCond %{REQUEST_URI}::$1 ^(.*?)/?(.*)::\2$

看起来这个运营商在任何参考或手册中都找不到。我在哪里可以找到它或任何人都可以解释这个操作符的作用?

1 个答案:

答案 0 :(得分:7)

这样的规则:

RewriteCond %{REQUEST_URI}::$1 ^(.*?/)(.*)::\2$
RewriteRule ^(.*)$ - [E=BASE:%1]

也可以写成(在条件的任一侧使用##作为固定分隔符):

RewriteCond %{REQUEST_URI}##$1 ^(.*?/)(.*)##\2$
RewriteRule ^(.*)$ - [E=BASE:%1]

<强>解释

  • 您可以在$1中使用从RewriteRule抓取的RewriteCond,因为mod_rewrite实际向后处理规则集。它从RewriteRule中的模式开始,如果匹配,则继续检查一个或多个RewriteCond
  • 正如您在RewriteCond中看到的那样,LHS(左侧/测试字符串)可以使用反向引用变量,例如$1$2%1%2等,但RHS(右侧)即条件字符串无法使用这些$1$2%1%2变量。
  • 在RHS条件部分内,我们可以使用的只有后向引用内部反向引用,即我们在此条件下捕获的组本身。它们由\1\2等表示。
  • RewriteCond首次捕获的群组中(.*?/)。它将由内部反向引用\1表示。
  • 您可以通过比较RewriteBase%{REQUEST_URI}来标记此规则基本上是$1 动态%{REQUEST_URI}的示例将为/directory/foobar.php,同一示例URI的$1示例将为foobar.php^(.*?/)::(.*)\1$正在区分第一个被捕获的小组%1\1。在此处,它将使%1\1填充值/directory/,稍后在设置env变量%{ENV:BASE}时使用该值E=BASE:%1