You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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]

逻辑说明

  1. 第一组规则:提取URL末尾的产品密钥,确认该密钥在RewriteMap中存在后,将对应的主URL写入PRODUCT_URL环境变量
  2. 第二组规则:检查环境变量已赋值,且当前请求URI与环境变量中的主URL不匹配时,返回410 Gone状态

内容的提问来源于stack exchange,提问作者nima1024

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:49:50