什么:: $ 1在htaccess中意味着什么?

Chr*_*mas 7 .htaccess mod-rewrite apache2

我一直在浏览symfony2框架源代码.在他们的示例网站的htaccess文件中,我发现%{REQUEST_URI}::$1如下:

RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
Run Code Online (Sandbox Code Playgroud)

该规则上面的评论解释道

以下内容将所有其他查询重写为前端控制器.该条件确保如果您使用Apache别名进行大规模虚拟主机托管,则会预先设置基本路径以允许正确解析app.php文件; 它也适用于非混淆环境,提供安全,一刀切的解决方案.

但是,这并不能解释::$1::\2.

他们是反向引用吗?如果没有,他们是什么?他们的目的是什么?

小智 12

我在Zend项目中遇到了几乎相同的htaccess文件,这是我的想法,希望它有所帮助.

htaccess文件(位于Zend项目目录,与index.php相同)说

RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
RewriteRule ^(.*)$ - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L]
Run Code Online (Sandbox Code Playgroud)

假设Zend安装在http://mydomain.tld/zend(稍后我们称之为你的域名)我们正在请求yourdomain/mycontroller/myaction

因此%{REQUEST_URI}/zend/mycontroller/myaction.

请注意$1,这是RewriteRulehtaccess context [1]中指令中的模式,"在删除引导服务器到当前的前缀RewriteRule(例如app1/index.htmlindex.html取决于指定定义的位置)之后,最初将与文件系统路径匹配" ".

因此$1mycontroller/myaction.

而且%{REQUEST_URI}::$1/zend/mycontroller/myaction::mycontroller/myaction.

上面的字符串将被匹配^(/.+)(.+)::\2$.请注意,对于圆括号中的两个捕获组,即(/.+)(.+)::许多组合可以匹配之前.例如:

第1组: /z

第2组: end/mycontroller/myaction

要么

第1组: /zend/mycontroller/myactio

第2组: n

中间的任何内容都是有效的匹配.事实上,最有趣的是

第1组: /zend/

第2组: mycontroller/myaction

哪个(是唯一的情况)对第二组进行反向引用\2(之后::)匹配.

在这种情况下,/zend/将存储在环境变量中BASE,这是第一个RewriteRule做的.的%1是指第一匹配的字符串在RewriteCond/zend/.

看第二个RewriteRule,很清楚为什么需要这个.由于index.php只能在中找到/zend/index.php,我们需要/zend/在前面添加index.php.

这里我们假设使用URL路径作为第二个RewriteRule指令的替换.请参阅[1]并在RewriteRule Directive部分下搜索"要服务的资源的DocumentRoot-相对路径".

以上所有都使查询字符串保持不变/不变.它取决于index.php如何解析查询字符串(以及URI).

最后是Zend安装在域根目录的情况.

  • %{REQUEST_URI}会的/mycontroller/myaction.
  • $1会的mycontroller/myaction.

RewriteCond匹配的字符串将是/mycontroller/myaction::mycontroller/myaction.

这次第二组(/.+)(.+)将永远不会匹配,mycontroller/myaction因为第一组的初始反斜杠后面至少需要一个字母,使得第二组尽可能接近ycontroller/myaction但不完全mycontroller/myaction匹配.

结果,第一个RewriteRule没有使用.该BASEenviornment变量将不会被设置,而当第二重写规则使用它,它只会是空的.

参考

[1] http://httpd.apache.org/docs/current/mod/mod_rewrite.html


Gum*_*mbo 6

$1%{REQUEST_URI}::$1引用的匹配字符串RewriteRule指令,即,匹配的字符串.*^(.*).因此%{REQUEST_URI}::$1,扩展为用户提供的请求的URI路径,以及当前内部URI路径和查询,由...分隔::.

该图案^(/.+)(.+)::\2$是用来寻找一个前缀,这使得剩余的部分匹配部分后面(第一捕获组)的::(\2是后参照第二捕获组的图案的匹配的字符串).

如果找到这样的匹配,则前缀存储在环境变量中BASE([E=BASE:%1]其中%1引用先前成功RewriteCond模式匹配的匹配字符串).