【问题标题】:Apache RewriteCond compare TIMEApache RewriteCond 比较 TIME
【发布时间】:2021-10-16 03:37:32
【问题描述】:

我正在为一些 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

到目前为止它似乎不起作用,这导致我来到这里。有人对如何解决这个问题有建议吗?

我能想象的最后一根稻草将是我评估表达式的任何类型的脚本。

【问题讨论】:

  • 你的完整规则是什么? “我以 YYMMDDHHmmss 格式加载日期” - 从文件的外观来看,格式是 YYYYMMDDHHmmss(因为它需要是)。

标签: apache mod-rewrite


【解决方案1】:
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。)

【讨论】:

  • 哇,伟大而简单的解决方案!比 php 或 Pearl 脚本要好得多。我只是想知道:这对治疗安全吗?我可以想象一个请求评估第 2 行,其中 LOOKUP_VALUE 保存一个空字符串,一个请求将有效值写入 LOOKUP_VALUE。
  • @fls 是的,很确定这是线程安全的。 AFAIK Apache 每个请求使用 1 个线程。
  • 我想到了一个场景,两个单独的请求属于这个“问题”......
  • @fls “问题”是什么?
猜你喜欢
  • 2017-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
相关资源
最近更新 更多