我目前正在开发一个支持多种语言的项目。为了对seo友好,我正在尝试重定向与其区域设置(或其首选语言)对应的用户子域。
即,我的项目的网址是 mydomain.com ,我使用子域 en.mydomain.com , es.mydomain.com , de.mydomain.com , fr.mydomain.com ...你明白了。所有子域名目前都由相同的grails应用程序提供。
我的grails项目会为每个子域维护不同的会话(由会话ID看到),因此当用户在语言之间切换时,信息会丢失。我没有预见到这一点。 :(
如何显式设置会话标识符?我希望它基于 mydomain.com 。
我得到了Apache Tomcat提供类似
的提示<Context sessionCookiePath="/" sessionCookieDomain=".mydomain.com">
,但这对开发环境等没有帮助。
任何提示?您是否尝试在数据库中存储会话信息?这有时用于负载平衡目的,也可能有帮助吗?!
非常感谢帮助(一如既往)!干杯!
答案 0 :(得分:0)
我认为您不能在不同的上下文根之间共享会话,更不用说子域了。 对于负载平衡,大多数配置使用粘性会话,其中相同的会话请求被定向到同一个应用服务器。有一些配置可以在负载均衡器下跨群集复制会话,以便为后续请求切换服务器。
这里有几个选项:
如果他们可以在网址重写中保留http会话,请提出一个特定于apache网址重写规则的问题。
放弃子域方法并使用其浏览器区域设置来嗅出要使用的消息包。 (我喜欢这种方法)
(曾经是2 :))探讨将会话信息放在域中可读的cookie中。我知道不允许跨域cookie,但子域名应该没问题。
答案 1 :(得分:0)
解决问题的一种方法是在tomcat前面使用nginx作为反向代理,并将请求从fr.mydomain.com
转换为localhost/yourapplication/fr/
或其他内容。
他会关心你的饼干。我附加了一个示例配置(稍微缩短了),我曾经使用过一次:
server {
server_name fr.yourdomain.com;
location /office {
proxy_pass http://localhost:8080/yourapplication/fr;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
}
}
server {
server_name es.yourdomain.com;
location /office {
proxy_pass http://localhost:8080/yourapplication/es;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
}
}
[..]