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.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 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
将$1在%{REQUEST_URI}::$1引用的匹配字符串RewriteRule指令,即,匹配的字符串.*中^(.*).因此%{REQUEST_URI}::$1,扩展为用户提供的请求的URI路径,以及当前内部URI路径和查询,由...分隔::.
该图案^(/.+)(.+)::\2$是用来寻找一个前缀,这使得剩余的部分匹配部分后面(第一捕获组)的::(\2是后参照第二捕获组的图案的匹配的字符串).
如果找到这样的匹配,则前缀存储在环境变量中BASE([E=BASE:%1]其中%1引用先前成功RewriteCond模式匹配的匹配字符串).
| 归档时间: |
|
| 查看次数: |
8365 次 |
| 最近记录: |