通过.htaccess检测Cookie值并重定向至带查询串的同页面
需求说明
我创建了一个用于识别城市的Cookie,名称为geodefense,存储的城市值为Piura(该值会根据客户所在的本国城市动态变化)。需要通过.htaccess实现重定向:当geodefense Cookie存在时,为当前页面URL添加geo=[Cookie值]的查询字符串,避免页面加载非对应城市的价格。
示例:
- 当前页面:
https://127.0.0.1/myproduct1 - 重定向目标(当Cookie存在时):
https://127.0.0.1/myproduct1?geo=Piura
我已有检测Cookie是否存在的.htaccess代码,但不知道如何获取Cookie值并实现上述重定向,现有代码如下:
RewriteEngine On RewriteCond %{HTTP_COOKIE} !cookie_name=specific_value; [NC] RewriteRule ^ http://www.google.com [NC,L]
解决方法
你需要修改.htaccess规则,通过正则捕获Cookie值,并添加防循环重定向的条件,最终代码如下:
RewriteEngine On # 捕获geodefense Cookie的值 RewriteCond %{HTTP_COOKIE} geodefense=([^;]+) [NC] # 确保当前URL没有geo参数,避免循环重定向 RewriteCond %{QUERY_STRING} !geo= [NC] # 重定向到原路径并拼接geo参数,%1引用捕获的Cookie值 RewriteRule ^(.*)$ /$1?geo=%1 [R=302,L,QSA]
代码说明
RewriteCond %{HTTP_COOKIE} geodefense=([^;]+) [NC]:匹配geodefenseCookie,用([^;]+)捕获Cookie值(直到遇到分号,对应Cookie键值对的分隔规则),[NC]表示不区分大小写。RewriteCond %{QUERY_STRING} !geo= [NC]:检查当前URL的查询参数中是否未包含geo=,防止重复重定向导致循环。RewriteRule ^(.*)$ /$1?geo=%1 [R=302,L,QSA]:^(.*)$捕获当前请求的URL路径;%1引用第一个条件捕获的Cookie值;[R=302]为临时重定向(测试完成后可改为R=301永久重定向);[L]表示这是最后一条执行的规则;[QSA]保留原URL已有的其他查询参数(如果存在)。
注意事项
- 确保服务器已启用mod_rewrite模块,否则规则无法生效;
- 若Cookie值包含特殊字符(如空格、&等),需额外处理编码,常规场景下
[^;]+的捕获方式可覆盖大多数情况。
内容的提问来源于stack exchange,提问作者Edu Rafael
相关产品推荐
相关产品推荐

