我创建了一个cookie来标识城市。
Cookie的名称如下:geodefense
,其中包含城市Piura
的值(此值可根据客户的不同而与我所在国家/地区的城市不同)
我需要通过添加.htaccess
的查询字符串来重定向,以防止页面加载显示不适用于该城市的价格
例如如果我在页面上
https://127.0.0.1/myproduct1
仅当geodefense
Cookie存在且将值作为查询字符串时才重定向
https://127.0.0.1/myproduct1?geo=[cookievalue]
目前,我有这个.htaccess
代码来检查cookie是否存在,但不知道如何获取cookie的值并重定向到相同的页面,但添加了查询字符串
RewriteEngine On
RewriteCond %{HTTP_COOKIE} !cookie_name=specific_value; [NC]
RewriteRule ^ http://www.google.com [NC,L]
1条答案
按热度按时间rqcrx0a61#
目前我有这个
.htaccess
代码来检查cookie是否存在...该代码检查cookie +特定值是否不存在(如 CondPattern 上的
!
前缀所示)。然而,这似乎有点反模式...当值已经存在于cookie中(并且可用于您的脚本)时,不必要地重定向用户?!无论如何,要回答您的特定问题,您需要执行如下操作:
上面的代码重定向任何没有
geo
URL参数的URL,* 并且 *geodefense
cookie以非空值存在于相同的URL,将geodefense
cookie的值作为geo
URL参数的值附加。然后附加原始请求上的任何其他查询字符串参数(QSA
标志的结果)。第一个 * 条件 *(
RewriteCond
指示词)会检查URL上是否已存在geo
URL参数。这是防止重新导向循环的必要条件,但也表示URL参数的优先级会高于Cookie值(如果两者都存在)。不过,这可能不是问题,什至可能是必要的。您可以验证URL参数(如果存在)是否与cookie值匹配,如果不匹配则替换它-但代价是增加了复杂性。第二个 condition 检查
geodefense
Cookie,并使用带括号的子模式(\w+)
捕获其值。然后,可以使用%1
反向引用在RewriteRule
* 替换 * 字符串中使用该值。\w
是表示 * 单词字符 * 的速记字符类,等效于字符类[a-zA-Z0-9_]
。更新日期:
可以禁用此行为,例如在购物车页面上禁用此行为,如127.0.0.1/store/cart
您可以在现有的 conditions 之前新增例外状况-negated condition(
RewriteCond
指示词)。例如:上面的代码检查请求的URL-path是否不完全等于
/store/cart
。=
前缀运算符使其成为一个完全匹配的字符串比较,而不是一个正则表达式。如果需要更大的灵活性,请使用正则表达式,例如:上面的正则表达式检查URL路径是否 * 以 *
/store/
开头。因此自然排除了/store/cart
和/store/<anything>
。这些规则在
.htaccess
文件中的顺序很重要。该规则必须位于.htaccess
文件顶部附近的任何前端控制器模式 * 之前 *(但位于任何阻塞指令之后)。