mod_rewrite RewriteCond 错误地不匹配模式

mod_rewrite RewriteCond falsly doesn't match pattern

这让我发疯。我想匹配一个非常简单的模式:

RewriteEngine On

RewriteRule .? - [E=tpl:%{REQUEST_URI}]

RewriteCond ${REQUEST_URI} a
RewriteRule .? - [E=tpl:presentation]

RewriteRule .? index.php?tpl=%{ENV:tpl} [QSA,L]

index.php 内,我目前只是 var_dump($_REQUEST); 检查 tpl 的值。每当我访问 URI /aaa_foo/bar 时,它都会转储相同的 URI。但是,如果我用简单的 '.' 替换 RewriteCond 中的 'a' 或否定条件,它会转储 'presentation'.

我完全无法理解为什么 'a' 不匹配,而明明在字符串中可以找到三个。我错过了什么吗?

请注意:我只是简单地使用 RewriteRule ^/bar - [E=tpl:presentation] 而没有使用 RewriteCond,尽管如此,我仍然想知道我在那里做错了什么。

如果 URI 包含 'a' 字符(在我的示例中确实如此),则该变量 tpl 将被分配值 presentation。因此,输出不应再是请求的 URI,而是 presentation

问题出在第二条规则上,应该是%{REQUEST_URI}而不是${REQUEST_URI}

RewriteCond %{REQUEST_URI} a
RewriteRule .? - [E=tpl:presentation]

或者更好:

RewriteRule a - [E=tpl:presentation]

为什么这么复杂?下面应该做你想做的:

RewriteRule a index.php?tpl=presentation [QSA,L]
RewriteRule .* index.php?tpl=%{REQUEST_URI} [QSA,L]