Apache RewriteCond 比较时间

Apache RewriteCond compare TIME

我正在为一些 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,则两个条件都将为 true(根据这些条件的感知逻辑)。

如果您要检查 相等性 ,那么您可以使用带有内部反向引用 (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 相同。)