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

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

该规则上方的注释说明



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

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

最佳答案

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

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

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

假设Zend安装在http://mydomain.tld/zend上(稍后将其称为yourdomain)
我们正在请求yourdomain/mycontroller/myaction
因此%{REQUEST_URI}将是/zend/mycontroller/myaction

请注意,htt上下文[1]中$1指令中的模式RewriteRule“将在删除导致服务器到达当前RewriteRule的前缀(例如app1/index.htmlindex.html取决于所在位置的前缀之后,首先与文件系统路径进行匹配)。指令已定义)”。

因此$1将是mycontroller/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指令部分下搜索“到要提供资源的DocumentRoot相对路径”。

以上所有内容使查询字符串保持不变/不变。由index.php决定如何解析查询字符串(以及URI)。

最后是在域根目录上安装Zend的情况。
  • %{REQUEST_URI}将是/mycontroller/myaction
  • $1将是mycontroller/myaction

  • 要由RewriteCond匹配的字符串将为/mycontroller/myaction::mycontroller/myaction

    这次(/.+)(.+)中的第二组将永远不会匹配mycontroller/myaction,因为第一组的初始反斜杠后必须至少有一个字母,从而使第二组与ycontroller/myaction接近,但与mycontroller/myaction并不完全相同,因此无法匹配。

    结果,不使用第一个RewriteRuleBASE环境变量将不会被设置,并且当第二个RewriteRule使用它时,它只会是空的。

    引用

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

    关于.htaccess -::$ 1在htaccess中是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16762119/

    10-11 09:25