Apache RewriteCond 比较 TIME

标签 apache mod-rewrite

我正在处理一些 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/

相关文章:

apache - Mod_Rewrite 将子域和目录设置为 GET 变量

php - URL 重写不适用于共享主机

php - max_input_time 的最大值是多少?

apache - 如何在不导致无限循环的情况下将所有请求重写为单个文件

apache - htaccess 中的 301 重定向具有参数 P 的 URL

.htaccess - 将所有请求重定向到 https ://

php - Apache - PHP 文件返回黑色,php 文件显示中甚至没有 HTML

apache - MR1 和 MR2 有什么区别?

java - 端口 80 上的 Apache Web 服务器和 Apache Tomcat - 配置

php - .htaccess 在亚马逊 ec2 ubuntu 实例中不工作