8

背景

我有 php/js 软件 ( Piwik ),它设置了一个 cookie 来跟踪对该站点的访问。

我们的站点(即不是 Piwik)设置为所有 URL(资源除外)都写回 /public/index.php。

这样,我们的每个用户都会获得一个唯一的 URL,例如;

http://www.example.com/user1

http://www.example.com/user2

... ETC

为了让我在 Piwik 中跟踪每个用户 URL,建议我需要将 cookie 中的路径设置为 Apache 映射到实际目录的路径。

由于我们没有每个用户的实际目录,我们不能这样做。

最后,我们继续使用.htaccess 中的RewriteBase来告诉 Apache 我们认为用户的 URL 是它自己的目录。

然而,这还不够,因为似乎没有一种方法可以在不硬编码“基础”的情况下使用 RewriteBase。

问题

我可以在我的 .htaccess 中做这样的事情吗? Francois Deschenes 的回答说我不能这样做。

RewriteCond ^([^/]*)(/.*)?
RewriteBase %1

我还有哪些其他替代方法可以确保将 cookie 的“路径”设置为用户的 URL 而不仅仅是“/”?

我目前拥有的

/ 中的 .htaccess 包含;

RewriteRule ^(.*)$ /public/$1 [L]

然后 /public 中的 .htaccess 包含;

RewriteRule ^index\.php5/(.*)$ -                   [L]
RewriteRule ^index\.php5?(.*)$ -                   [L]
RewriteRule ^index\.php5$      -                   [L]

RewriteRule ^(.*)$             /public/index.php5  [L]

请注意,对于已移动的路径等,这两者在开头都有其他规则。

感谢您的任何帮助!

我试过的

按照Piwik 文档中的建议,在 JS Piwik 对象上调用 .setCookiePath()。例如,对于 URL http://www.example.com/user1,调用 .setCookiePath('/user1') 实际上不会设置 cookie 的路径。

向 URL添加尾部斜杠,然后调用 .setCookiePath()。例如,URL http://www.example.com/user1/然后调用 .setCookiePath('/user1') 不会设置 cookie 的路径。

相关问题

使用 mod_rewrite 我可以在 RewriteCond 中指定 RewriteBase 吗?- 不幸的是,答案并没有表明我是否可以使用当前路径作为基础。

4

1 回答 1

6

You can't do that, with mod_rewrite. Apache and mod_rewrite have nothing to do with cookies (at least as far as Piwik is concerned). This isn't an Apache-related issue but how Piwik sets the cookie. If you're using the Piwik JavaScript tracker, have a look at this specific section of the documentation, more specifically the "If you track one domain sub directories or pages in different Piwik websites" section.

You'll essentially want to use the setCookiePath function and wherever you set the JavaScript, use PHP to fill in the path:

Javascript:

tracker.setCookiePath('/user1');

To add a trailing slash in .htaccess

Add this on top of your other rules:

RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://example.org/$1/ [L,R=301]
于 2011-06-28T04:11:54.017 回答