我正在处理一些 Apache HTTP 服务器配置。具体来说,我通过 RewriteMap
从查找文件中加载格式为 YYMMDDHHmmss 的日期,我尝试将其与来自TIME
变量。
RewriteMap lookup "txt:/path/to/file.flat"
RewriteCond ${lookup:somekey|NOT_FOUND} NOT_FOUND [or]
RewriteCond ${lookup:somekey|19700101010101} <%{TIME}
在file.flat
中会是这样的:
somekey 20211010042042
到目前为止它似乎不起作用,这导致我来到这里。有人对如何解决这个问题有建议吗?
我能想象的最后一根稻草将是我用来评估表达式的任何类型的脚本。
最佳答案
RewriteCond ${lookup:somekey|NOT_FOUND} NOT_FOUND [or] RewriteCond ${lookup:somekey|19700101010101} <%{TIME}
您尚未在示例中包含完整的规则(即 RewriteRule
指令)。根据您想要执行的具体操作,您可能会决定以不同的方式解决此问题。
上述条件的主要问题是 %{VARIABLE}
形式的服务器变量未在 CondPattern 中扩展(第二个RewriteCond
指令的参数)。因此 %{TIME}
被视为文字文本。
旁白:这里不需要两个条件。如果在重写映射中找不到somekey,则两个条件都将为真(通过这些条件的感知逻辑)。
如果您要检查相等性,那么您可以使用带有内部反向引用的正则表达式 ( for example )。但是,您正在检查“小于”(字典字符串比较)。
解决此问题的一种方法是将重写映射查找的值分配给环境变量,并在 Apache 表达式(RewriteCond expr
指令 - 在 Apache 2.4 上可用)中使用它来进行比较。您无法直接在 Apache 表达式中查找重写映射。
例如:
RewriteRule ^ - [E=LOOKUP_VALUE:${lookup:somekey}]
RewriteCond expr "reqenv('LOOKUP_VALUE') < %{TIME}"
RewriteRule ^ - [E=SUCCESS:1]
在您的示例中,您不需要显式设置DefaultValue(如果在重写映射中找不到该键),因为空字符串总是会出现“小于”%{TIME}
。 (与19700101010101
相同。)
关于Apache RewriteCond 比较 TIME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69587868/