我有一个RewriteCond
检查是否{QUERY_STRING}
包含正确的版本号,如果没有,则将用户重定向到正确的版本。
例如,如果 v0.7 是最新的,http://localhost/?v=0.5
则应将访问的用户重定向到,http://localhost/?v=0.7
但由于某种原因,如果RewriteMap
在条件下使用,它不起作用...
这有效
RewriteMap versions txt:/var/www/html/version.txt
RewriteCond "%{QUERY_STRING}" !^v=0.7
RewriteRule "^/$" "/?v=${versions:version}" [R,L]
这不
RewriteMap versions txt:/var/www/html/version.txt
RewriteCond "%{QUERY_STRING}" !^v=${versions:version}
RewriteRule "^/$" "/?v=${versions:version}" [R,L]
version.txt 的内容
##
## version.txt -- rewriting map
## The version number written here will be mapped to the URL
##
##
version 0.7
这不起作用,因为CondPattern(
RewriteCond
指令的第二个参数)是一个正则表达式,因此不支持变量扩展。(就像您不能使用表单$n
或%n
服务器变量%(SERVER_VAR}
或环境变量%{ENV:MY_ENV_VAR}
等的反向引用一样。)否则它会与 PCRE 正则表达式语法冲突。只有TestString(RewriteCond
指令的第一个参数)和RewriteRule
替换参数支持变量扩展,因为这些参数是“常规”字符串,而不是正则表达式。但是,您仍然可以执行所需的操作并检查从 . 返回的正确版本号
RewriteMap
是否存在于查询字符串的开头。相反,扩展TestStringRewriteMap
中的结果(它支持变量扩展,因为这是一个“普通”字符串,而不是正则表达式)并使用内部反向引用进行比较。例如,将 更改
RewriteCond
为:在变量扩展之后,我们最终将表单的字符串
[email protected]
与 regex匹配^v=([\d.]+)(?:&.*)?@\1
。\1
是对第一个捕获的子模式的内部反向引用(即v
URL 参数的值)。因此,这有效地将 URL 参数值与从RewriteMap
. 然后整个表达式被否定(!
前缀)所以当条件不匹配时它是成功的,即。版本号不同。([\d.]+)
- 匹配查询字符串中的版本号,它由 1 个或多个数字或文字点组成。例如。0.5
(?:&.*)?
- 匹配查询字符串的其余部分(如果有)。@
只是查询字符串或“版本”字符串中不会出现的任意字符串。您不需要将参数括在双引号中,除非它们包含空格(即使这样,您也可以使用反斜杠转义空格)。因此,在此示例中,双引号完全是可选的。这同样适用于
RewriteRule
指令。