我有一个以不同语言提供的小站点,这些语言是根据以下标准选择的(增加优先顺序):
Accept-Language由浏览器末端包含语言首选项
网站本身只包含静态HTML页面,我希望尽可能保持这种状态。我通过mod_negotiation、mod_rewrite和以下.htaccess文件实现了语言选择(缩短为省略语言和字符集的声明):
Options FollowSymLinks MultiViews
DirectoryIndex index
Header set Pragma no-cache
RewriteEngine on
RewriteRule ^([a-zA-Z-]{2,5})$ index [CO=language:$1:.example.com:525600,E=LANG:$1]
SetEnvIf Cookie "language=([a-zA-Z-]+)" COOKIE_LANG=$1
SetEnvIf COOKIE_LANG (.+) prefer-language=$1
SetEnvIf REDIRECT_LANG (.+) prefer-language=$1
# plenty of AddLanguage and AddCharset calls
LanguagePriority en-us
DefaultLanguage en-us
ForceLanguagePriority Prefer Fallback该机构自8月左右以来一直运作良好,以便能够做到以下几点:
MultiViews)
Accept-Language接管(感谢 present,该cookie的语言将使用/es或类似的prefer-language设置为该值。现在,我在站点上有了更多的资源,多亏了MultiViews,可以通过/resource而不是/resource.html和内容协商来选择这些资源,cookie选项对于选择合适的语言仍然很好。
现在,我希望扩展URI处理,以便像/resource/en这样的东西可以直接选择特定语言中的资源,这样就不仅适用于/了。我尝试了下面的RewriteRule
RewriteRule ^(([^/]+)/)?([a-zA-Z-]{2,5})$ /$2 [CO=language:$3:.example.com:525600,E=LANG:$3]而且,发送正确的资源和设置正确的cookie是有效的,但是首选语言显然不再从环境变量中提取。现在唯一强迫语言选择的是cookie,但是在这个请求上,这仍然是相同的,所以在刷新页面之前我不会看到新的语言。到目前为止,我对这些规则所做的任何尝试都没有对这种行为产生影响。有趣的是,有了这条规则,上面记录的旧行为仍然有效。只有当我请求与/不同的东西时,它才会做一些奇怪的事情。
这是在共享主机上(在FreeBSD监狱中),因此我无法启用重写日志(因为我甚至不知道文件所在的物理路径);此外,它显然忽略了环境变量,而且出于某种原因只使用cookie设置首选语言。到目前为止我还不知道为什么。有什么帮助吗?
发布于 2011-11-14 02:22:19
我现在通过在RewriteRule和SetEnvIf之间混合语言选择来解决这个问题。
SetEnvIf Cookie "language=([a-zA-Z-]+)" prefer-language=$1
SetEnvIf REDIRECT_prefer-language "(.+)" prefer-language=$1
SetEnvIf Request_URI "/([a-zA-Z-]{2,5})$" prefer-language=$1
RewriteRule "^(([^/]+)/)?([a-zA-Z-]{2,5})$" /$2 [CO=language:$3:.example.com:525600]规则现在只设置cookie并指向正确的资源,而语言选择则通过在请求URI上的匹配来处理。仍然感觉很奇怪,特别是当需要以REDIRECT_作为前缀时,很难看到它,但至少它现在起作用了。
https://stackoverflow.com/questions/8111891
复制相似问题