我一直在浏览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.html
或index.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
并不完全相同,因此无法匹配。结果,不使用第一个
RewriteRule
。 BASE
环境变量将不会被设置,并且当第二个RewriteRule使用它时,它只会是空的。引用
[1] http://httpd.apache.org/docs/current/mod/mod_rewrite.html
关于.htaccess -::$ 1在htaccess中是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16762119/