.htacces从www.example.com
重定向到example.com
(相同的域名,无www。)
返回的访问者可以在用户代理中拥有visitor_id
cookie
我希望通过cookie或会话中的域提供此值
我试过这个,但是为www域创建了cookie
RewriteCond %{HTTP_HOST} ^www.example.com
RewriteCond %{HTTP_COOKIE} visitor_id=([^;]+)
RewriteRule .* - [C,env=foo:%1]
RewriteRule ^(.*) http://example.com [L,R=301]
Header set Set-Cookie "visitor_id=%{foo}e; path=/" env=foo
此外,环境变量适用于localhost(Apache 2.4.2,Win32),但在线(Apache 2.2.25,linux)中cookie的值为"%{foo}e"
而不是预期的数量。
还尝试使用mod_session_cookie
,但找不到实际的例子。
如何通过域重定向,将visitor_id
带入Cookie或会话Cookie?
答案 0 :(得分:4)
由于环境%{env}
变量在不同的Apache版本中表现不一致,我建议使用RewriteRule
<设置 cookie 并使用[CO]
< em> cookie flag。
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteCond %{HTTP_COOKIE} visitor_id=([^;]+) [NC]
RewriteRule .* $0/vid/%1 [C] # Appends the cookie value to the URL
RewriteRule ^(.*)/vid/(.*)$ http://example.com/$1 [L,R=301,CO=visitor_id:$2:.example.com:14400:/]
以下是对.htaccess
文件所做更改的列表:
RewriteCond
匹配现在不区分大小写(使用[NC]
)
%{HTTP_HOST}
条件中的点已被转义\.
(.
与其他字符匹配)
第一个RewriteRule
将访问者ID(记录为%1
)附加到网址(捕获为$0
)
最后一位RewriteRule
会从网址中解析访问者ID(为$1
)并执行永久[R=301]
重定向到http://example.com
并同时编写一个名为的Cookie visitor_id
使用[CO]
标记。
cookie 重写标志的语法如下
[CO=NAME:VALUE:DOMAIN:lifetime:path:secure:httponly]
其中指定 name , value 和 domain 的值是必需的。 生存期默认为0
,这意味着Cookie仅在当前浏览器会话中保留。 路径默认为/
,安全, httponly 为false
。
使用的[CO]
标记将域指定为.example.com
,以便example.com
域下的所有主机都可以访问 cookie 。 生命周期指定为14400
,以分钟为单位,因此相当于10
天。
答案 1 :(得分:1)
Cookie可应用于域和子域。
如果您未设置域cookie属性,则默认情况下,Cookie域将是使用的完整主机名。实际上,定位http://www.example.com
的用户会获得域名为www.example.com的Cookie,并且在example.com
重定向后,此cookie无效。
但是,如果您的应用程序在example.com或www.example.com上发送的cookie包含:
# Watchout there is a dot in front of the domain
# required for old browsers to match subdomains
domain=.example.com;
然后,此cookie对http://example.com
和http://www.example.com
都有效(实际上对于任何子徽章也是如此)。客户端会自动管理它,在apache配置中没有任何复杂的东西。
相反,这些东西在应用程序中负责生成visitor_id cookie ,如果它是一个PHP应用程序,这是默认情况下在cookie_domain设置中定义的,但它也可以是强制执行session_set_cookie_params功能使用。当然,这些设置也可用于Java EE或.Net应用程序,在所有Web应用程序中,您可以对cookie域进行一些控制。
这可以用于简单的SSO机制或跟踪子域之间的访问者,就像你的情况一样,这是一个非常强大的解决方案。