我想大家可能都有碰到这种情况,就是在访问Magento网站的时候,有的时候后面会带一个session id字符串,有时候却没有。如:

http://www.4u4v.cn/?SID=51b1828e1c2e3281965bf05210f6d0fa

那么什么时候会再现SID,什么时候没有呢?我们知道访问一个域名通常可以使用下列两种形式:

www.4u4v.cn
4u4v.cn

只要你的DNS设定指向了同一个IP,并且apache做了相应的配置,问题就在于此。当你的Magento设置(System-> Configuration-> Web -> Un secure) 的base URL是http://www.4u4v.cn时,而你使用http://4u4v.cn访问时,那么打开的页面中有的链接就会带SID字符串,而且是那么分使用相对路径生成的URL中会有。反之也是,如果magento后台中设置的base url是4u4v.cn时,在使用www.4u4v.cn访问时,同样也会带sid字符串。

那带SID的URL会带来什么问题?

第一,可能会导致某些magento页面无法访问, 尤其是那些在代码中是通过相对路径来指定生成的URL。比如,本来应该是生成

http://www.4u4v.cn/contacts/

现在却是

http://www.4u4v.cn/?SID=51b1828e1c2e3281965bf05210f6d0facontacts/

显然是会进入404错误提示页面的。

第二,对SEO不利。我们总不想搜索引擎收录的页面中使用的URL是带链接的吧!

http://www.4u4v.cn/contacts/?SID=f3b20768c9dc0df7a0889e89cda61cb3
http://www.4u4v.cn/contacts/?SID=3760d086e67b0d6f3821362cb9efa7ef
http://www.4u4v.cn/contacts/?SID=0bf7387b53f8d75bd9028c652b90d107

显然这样会使用不同的URL(对搜索引擎来说)收录同一个页面,这样对PageRank是及其不利的。因为搜索引擎讨厌duplicate content(重复内容),因为这样对别人查询资料是不利的。这样岂不是冤枉了,你明明没有重复的内容!

解决方案:
是通过apache的重写模块(mod_rewrite)将对会造成URL后面带SID的那个域名的所有请求重定向到不会造成带SID URL的那个域名上去。(可以直接将下列的命令添加到.htaccess文件中,当然如果为了好一点的性能,建议直接放到对应虚拟主机的定义中,要使用 directory容器包含)

RewriteEngine on //打开重写引擎,Magento自带的.htaccess中已经是打开的了。

如果你后台使用的是没有带www的域名做Magento的base url,那么我们需要将所有对带www的域名的请求重定向到这个没带www的短域名上,即magento的base url.

RewriteCond %{HTTP_HOST} !^yourdomain\.com$ [NC]  
RewriteRule ^(.*)$ http://yourdomain.com/$1 [R=301,L] 
RewriteCond %{HTTP_HOST} !^yourdomain\.com$ [NC]
RewriteRule ^(.*)$ http://yourdomain.com/$1 [R=301,L]

相反,则应用:

RewriteCond %{HTTP_HOST} !^www\.yourdomain\.com$ [NC]  
RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L] 
RewriteCond %{HTTP_HOST} !^www\.yourdomain\.com$ [NC]
RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]

简单分析一下上面使用的的mod_rewrite模块的相关指令:

RewriteCond指令用来定义重定向(或重写URL)的条件, 基本语法格式是

RewriteCond TestString CondPattern,其中 %{HTTP_HOST}指代所有请求URL中的主机名,即www.xyzabc.com或xyzabc.com。

^yourdomain\.com$ 正规表达式匹配yourdomain.com,前面以!开头表示所有主机名不是yourdomain.com的就改写成yourdomain。同样的!www\.yourdomain\.com条件是指所有主机名不是www.yourdomain.com的就改写成www.yourdomain.com.