4

.htacces 重定向从www.example.comexample.com(没有 www 的相同域。)
回访者可能在用户代理中有一个 visitor_idcookie。
我想通过 cookie 或会话中的域带来这个值。
我试过了,但是 cookie 是为 www 域创建的

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_idcookie 或会话 cookie?

4

2 回答 2

4

由于环境%{env}变量在不同 Apache 版本中的行为不一致,我建议使用cookie标志将cookie设置为RewriteRule自身。[CO]

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)附加到 URL(捕获为$0

  • 最后一个RewriteRule解析来自 URL (as ) 的访问者 id$1并执行永久[R=301]重定向,http://example.com同时写入一个visitor_id使用[CO]标志命名的 cookie。

cookie重写标志的语法如下

[CO=NAME:VALUE:DOMAIN:lifetime:path:secure:httponly]

其中为namevaluedomain指定值是强制性的。生命周期默认为0这意味着 cookie 仅在当前浏览器会话中持续存在。路径默认为/,安全httponlyfalse.

使用的[CO]标志指定.example.com以便域下的所有主机都可以访问cookieexample.com。生命周期被指定为14400以分钟为单位,因此等于10天。

于 2013-08-20T20:37:55.027 回答
1

Cookies 可以应用于子域

如果不设置域 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;

http://example.com那么这个 cookie 对and都有效http://www.example.com(事实上也对任何 subdomin 有效)。客户端会自动管理它,而 Apache 配置中没有任何复杂的东西。

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

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

于 2013-08-21T07:55:19.427 回答