【发布时间】:2017-06-03 12:29:37
【问题描述】:
我熟悉 Regexp、RewriteCond 和 RewriteRule。
问题是我的 RewriteRule 没有替换上一个 RewriteCond 的捕获组。
Apache v2.4.10
RewriteCond %{REQUEST_URI} !(apps/)?index.php
RewriteRule ^(apps/)?(.*)$ /%1index.php?$2 [QSA,NC,L]
根据文档,%1 应该替换为 RewriteCond 中的捕获组:(apps/) 但不是。
Apache 调试:
RewriteCond: input='/apps/x/y' pattern='!(apps/)?index.php' => matched
rewrite 'x/y' -> '/index.php?x/y'
调试确实说 Cond 是匹配的,因此它应该捕获该组。
它表示输入包含apps/ 部分。
但是,重写不考虑它......
如下添加一个额外的(无用的)RewriteCond 来强制匹配,但不使用 ! 否定模式 确实 使其工作,因此确实捕获并替换了捕获组:
RewriteCond %{REQUEST_URI} !(apps/)?index.php
RewriteCond %{REQUEST_URI} ^/(apps/)?
RewriteRule ^(apps/)?(.*)$ /%1index.php?$2 [QSA,NC,L]
有什么想法吗?这是来自带有! 的正则表达式的某种优化,因此它不会评估捕获组?这应该被报告为错误吗?它在任何地方都有记录吗?
【问题讨论】:
标签: apache .htaccess mod-rewrite