.htaccess 通过多视图选择语言仅在请求其他资源时部分有效

.htaccess 通过多视图选择语言仅在请求其他资源时部分有效,.htaccess,mod-rewrite,apache2,multiviews,mod-negotiation,.htaccess,Mod Rewrite,Apache2,Multiviews,Mod Negotiation,我有一个不同语言的小网站,它是根据以下标准选择的(优先顺序递增): 接受浏览器发送的语言 指定首选语言的cookie 在末尾包含语言首选项的请求路径 该网站本身只包含静态HTML页面,我希望尽可能保持这种方式。我通过mod_negotiation,mod_rewrite和以下.htaccess文件(缩写为省略语言和字符集声明)实现了语言选择: 考虑到以下情况,自8月左右以来一直处于罚款状态: 不存在cookie,Accept Language接管(多亏了MultiViews) 如果存在Cooki

我有一个不同语言的小网站,它是根据以下标准选择的(优先顺序递增):

  • 接受浏览器发送的语言
  • 指定首选语言的cookie
  • 在末尾包含语言首选项的请求路径
  • 该网站本身只包含静态HTML页面,我希望尽可能保持这种方式。我通过
    mod_negotiation
    mod_rewrite
    和以下
    .htaccess
    文件(缩写为省略语言和字符集声明)实现了语言选择:

    考虑到以下情况,自8月左右以来一直处于罚款状态:

  • 不存在cookie,
    Accept Language
    接管(多亏了
    MultiViews
  • 如果存在Cookie,将使用Cookie的语言(
    首选语言
  • 请求路径为
    /es
    或类似路径,用于(a)设置cookie和(b)将
    首选语言设置为该值
  • 现在,我在网站上还有一些资源,由于有了
    多视图
    ,可以通过
    /resource
    而不是
    /resource.html
    和内容协商来选择这些资源,而cookie选项仍然可以很好地在这里选择合适的语言

    现在我想扩展URI处理,以便像
    /resource/en
    这样的东西可以直接选择特定语言中的资源,这样就不仅仅适用于
    /
    。我尝试了以下
    重写规则

    RewriteRule ^(([^/]+)/)?([a-zA-Z-]{2,5})$ /$2 [CO=language:$3:.example.com:525600,E=LANG:$3]
    
    它的作用是发送正确的资源并设置正确的cookie,但是首选语言显然不再从环境变量中获取。现在唯一强制选择语言的是cookie,但在该请求中,cookie仍然与以前相同,因此在刷新页面之前,我不会看到新语言。到目前为止,我在规则方面所做的任何尝试都没有对这种行为产生影响。有趣的是,根据这条规则,上面记录的旧行为仍然可以正常工作。只有当我请求与
    /
    不同的东西时,它才会做出奇怪的事情


    这是在共享主机上(在FreeBSD监狱内),因此我无法启用重写日志(因为我甚至不知道文件所在的物理路径);此外,出于某种原因,它显然忽略了环境变量,而只使用cookie设置首选语言。到目前为止我还不知道为什么。有什么帮助吗?

    我现在通过在
    RewriteRule
    setenif
    之间混合选择语言解决了这个问题:

    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\uuuu
    时,它不容易看到,但至少它现在可以工作了。

    我现在通过在
    RewriteRule
    setenif
    之间混合语言选择解决了这个问题:

    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\uuuu
    时,它不容易看到,但至少现在它可以工作了