重定向同一页,但如果cookie值为.htaccess,则添加查询字符串

ql3eal8s  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(113)

我创建了一个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]
rqcrx0a6

rqcrx0a61#

目前我有这个.htaccess代码来检查cookie是否存在...

RewriteCond %{HTTP_COOKIE} !cookie_name=specific_value; [NC]
RewriteRule ^ http://www.google.com [NC,L]

该代码检查cookie +特定值是否存在(如 CondPattern 上的!前缀所示)。
然而,这似乎有点反模式...当值已经存在于cookie中(并且可用于您的脚本)时,不必要地重定向用户?!无论如何,要回答您的特定问题,您需要执行如下操作:

RewriteCond %{QUERY_STRING} !(^|&)geo=
RewriteCond %{HTTP_COOKIE} (?:^|\s|;)geodefense=(\w+)($|\s|;)
RewriteRule ^ %{REQUEST_URI}?geo=%1 [QSA,R=302,L]

上面的代码重定向任何没有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指示词)。例如:

RewriteCond %{REQUEST_URI} !=/store/cart
:

上面的代码检查请求的URL-path是否不完全等于/store/cart=前缀运算符使其成为一个完全匹配的字符串比较,而不是一个正则表达式。如果需要更大的灵活性,请使用正则表达式,例如:

RewriteCond %{REQUEST_URI} !^/store/
:

上面的正则表达式检查URL路径是否 * 以 * /store/开头。因此自然排除了/store/cart/store/<anything>
这些规则在.htaccess文件中的顺序很重要。该规则必须位于.htaccess文件顶部附近的任何前端控制器模式 * 之前 *(但位于任何阻塞指令之后)。

相关问题