Apache配置dbm型RewriteMap后带参数URL重写失败的解决咨询
Apache带查询参数的RewriteMap重写配置方案
问题根源
RewriteRule默认仅匹配URL的路径部分,不会包含?后面的查询字符串,因此带___store参数的请求无法匹配你当前RewriteMap中仅存储的路径key,导致重写失效。
配置调整步骤
1. 调整RewriteMap键规则
你需要将路径+对应的___store查询参数作为完整key存入rewrite.dbm,key和目标值的映射关系和你给出的期望规则完全对应即可,示例如下:
| 键(key) | 目标值(value) |
|---|---|
| kronen-und-gehaeusetuben/wasserdicht-typ-pbbz.html | Produkte/Werke-Uhrenersatzteile/Schraubkronen-PBBZ-wasserdicht/ |
| kronen-und-gehaeusetuben/wasserdicht-typ-pbbz.html?___store=default | Produkte/Werke-Uhrenersatzteile/Schraubkronen-PBBZ-wasserdicht/ |
| kronen-und-gehaeusetuben/wasserdicht-typ-pbbz.html?___store=en | en/Products/Watch-replacement-parts/Watch-crowns/Screw-on-crowns/Screw-on-crowns-PBBZ-waterproof/ |
| kronen-und-gehaeusetuben/wasserdicht-typ-pbbz.html?___store=fr | fr/Produits/Couronnes/Couronnes-vissees/Couronnes-vissees-PBBZ-etanches/ |
| kronen-und-gehaeusetuben/wasserdicht-typ-pbbz.html?___store=es | es/Productos/Movimientos-Piezas/Piezas-de-repuesto-para-relojes/Coronas/Coronas-a-rosca/Coronas-a-rosca-PBBZ-hermeticas/ |
2. 修改虚拟主机重写规则
调整后的完整配置如下:
<VirtualHost *:80> DocumentRoot "/var/www/html" #ServerName www.example.com RewriteMap rewrite_DB "dbm:conf/rewrite.dbm" <Directory "/var/www/html"> Options FollowSymLinks Includes ExecCGI AllowOverride All DirectoryIndex index.html RewriteEngine On LogLevel alert rewrite:trace4 RewriteBase / # 优先处理带___store查询参数的请求 RewriteCond %{QUERY_STRING} ^___store=([a-z]+)$ RewriteRule "^(.*\.html)$" "${rewrite_DB:$1?___store=%1|${rewrite_DB:$1|/}}" [L,NC,R=301,QSD] # 处理不带查询参数的HTML请求 RewriteRule "^(.*\.html)$" "${rewrite_DB:$1|/}" [L,NC,R=301] </Directory> </VirtualHost>
配置说明
- 通过
RewriteCond %{QUERY_STRING} ^___store=([a-z]+)$捕获查询参数中的___store值,存入%1变量用于拼接查找key - 查找RewriteMap时优先尝试匹配「路径+参数」的组合key,若不存在则自动 fallback 到仅匹配路径的key,兼容你
default参数和无参数返回同一目标的需求 - 新增的
QSD标志会在重定向后丢弃原始查询参数,匹配你给出的重定向结果无参数的要求 - 规则顺序不可调换,需先处理带参数的场景再处理无参数场景,避免逻辑覆盖
内容的提问来源于stack exchange,提问作者Matthias Nicolas
相关产品推荐
相关产品推荐

