如何基于Apache的RewriteMap查找设置RewriteRule规则?
Apache RewriteRule:对与RewriteMap主URL不匹配的请求返回410 Gone
我需要在Apache中配置重写规则,对那些与RewriteMap中对应主URL不匹配的请求返回410 Gone状态。
已定义的RewriteMap:
RewriteMap product_map txt:/path/to/product_map.txt
product_map.txt中的条目:
55-55f /tv-backlight/55-55f 65-65ju /tv-backlight/65-65ju
需求目标
- 从URL中提取产品密钥(例如
55-55f) - 通过RewriteMap查找该密钥对应的主URL
- 将当前
REQUEST_URI与查到的主URL对比 - 对不匹配的请求返回410 Gone
失败的尝试
尝试1:基础RewriteCond
RewriteCond %{REQUEST_URI} ^.*/([^/]+)$ RewriteCond ${product_map:%1|NOT_FOUND} !=NOT_FOUND RewriteCond %{REQUEST_URI} !=${product_map:%1|NOT_FOUND} RewriteRule ^ - [G,L]
- 预期:提取产品密钥,获取主URL并完成对比
- 实际:失败,因为RewriteCond右侧的
${product_map:%1|NOT_FOUND}未被解析,Apache将其当作字面字符串处理
尝试2:使用RewriteCond expr
RewriteCond %{REQUEST_URI} ^.*/([^/]+)$ RewriteCond ${product:%1|NOT_FOUND} ^(.*)$ RewriteCond expr "%{REQUEST_URI} != %2" RewriteRule ^ - [G,L]
- 预期:提取产品密钥,获取主URL并完成对比
- 实际:失败,因为RewriteCond右侧的
%2未被解析,Apache将其当作字面字符串处理
正确解决方案
Apache的RewriteCond在右侧无法直接引用RewriteMap结果或反向引用,需要借助环境变量中转值实现对比逻辑:
# 提取产品密钥,将对应的主URL存入环境变量 RewriteCond %{REQUEST_URI} ^.*/([^/]+)$ RewriteCond ${product_map:%1|NOT_FOUND} !=NOT_FOUND RewriteRule ^ - [E=PRODUCT_URL:${product_map:%1|NOT_FOUND}] # 对比请求URI与主URL,不匹配则返回410 RewriteCond %{ENV:PRODUCT_URL} !="" RewriteCond %{REQUEST_URI} !=%{ENV:PRODUCT_URL} RewriteRule ^ - [G,L]
逻辑说明
- 第一组规则:提取URL末尾的产品密钥,确认该密钥在RewriteMap中存在后,将对应的主URL写入
PRODUCT_URL环境变量 - 第二组规则:检查环境变量已赋值,且当前请求URI与环境变量中的主URL不匹配时,返回410 Gone状态
内容的提问来源于stack exchange,提问作者nima1024
相关产品推荐
相关产品推荐

