htaccess从www到非www在会话/ cookie中引入变量

时间:2013-08-13 00:20:37

标签: .htaccess redirect cookies session-variables

.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?

2 个答案:

答案 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.comhttp://www.example.com都有效(实际上对于任何子徽章也是如此)。客户端会自动管理它,在apache配置中没有任何复杂的东西。

相反,这些东西在应用程序中负责生成visitor_id cookie ,如果它是一个PHP应用程序,这是默认情况下在cookie_domain设置中定义的,但它也可以是强制执行session_set_cookie_params功能使用。当然,这些设置也可用于Java EE或.Net应用程序,在所有Web应用程序中,您可以对cookie域进行一些控制。

这可以用于简单的SSO机制或跟踪子域之间的访问者,就像你的情况一样,这是一个非常强大的解决方案。