4

我有一些希望通过 Apache 提供的多语言静态内容。这些文件是应用程序生成的 JIT 缓存文件,因此如果它们存在,则应该提供它们,否则将请求转发给应用程序,应用程序将就地创建它们。

我通过 HTTP 的Accept-Language标头指定语言,它可以是hr, en, 也可以是en-US,en;q=0.5(因此没有简单的“将语言附加到文件名以继续”)。

网址如下:

在我的应用程序中,我有一个布局完全相同的文件夹,仅附加了语言,如下所示:

/static/homepage.html.en
/static/homepage.html.hr
/static/script.js.en
/static/script.js.hr

我已经弄清楚了Accept-Language我需要的解析mod_negotiation并想出了这个:

# Alias
/static /www/app/var/cache/static
<Directory /www/app/var/cache/static>
  FileETag MTime Size
  Options MultiViews
  AddLanguage hr .hr
  AddLanguage en .en
  <IfModule mod_negotiation.c>
    LanguagePriority en hr
  </IfModule>      

  ErrorDocument 404 /index.php
</Directory>

它有效,但仅适用于第一次错过。所以

  1. 如果我请求http://www.example.com/static/homepage.htmlAccept-Language: hr它将创建homepage.html.hr(正确)
  2. 现在,如果我请求http://www.example.com/static/homepage.htmlAccept-Language: en它不会抛出 404 (通过它触发文件生成过程)而是服务homepage.html.hr(这对于 Apache 来说足够接近,但不正确为了我)。

我看到的解决方案:

  • 通过 PHP 提供静态文件(我想避免)
  • 使用mod_rewrite(但我错过了Accept-Language解析部分)
  • 预先生成所有文件(这似乎是一个巨大的拖累)

有第四种方法还是我缺少的东西?

编辑:根据接受的答案的完整解决方案

# Alias
/static /www/app/var/cache/static
<Directory /www/app/var/cache/static>
  FileETag MTime Size
  Options MultiViews
  AddLanguage hr .hr
  AddLanguage en .en
  <IfModule mod_negotiation.c>
    LanguagePriority en hr
    ForceLanguagePriority none
  </IfModule>      

  ErrorDocument 404 /index.php
  ErrorDocument 406 /index.php
</Directory>
4

2 回答 2

1

也许ForceLanguagePriority设置为“Prefer”或“Prefer Fallback”。如果您将其设置为“无”,Apache 将生成 406 错误,您可以将其配置为触发与 404 相同的文件生成过程。

于 2014-10-05T22:06:32.230 回答
0

使用 mod rewrite 你可以这样做:

<Directory /www/app/var/cache/static>
  RewriteEngine On

  RewriteCond %{HTTP:Accept-Language} ^pl.*$ [NC]
  RewriteCond %{REQUEST_URI} ^.*(js|css)$ [NC]
  RewriteRule ^(.*)$ %{REQUEST_URI}.pl [L,R=302]

  RewriteCond %{HTTP:Accept-Language} ^hr.*$ [NC]
  RewriteCond %{REQUEST_URI} ^.*(js|css)$ [NC]
  RewriteRule ^(.*)$ %{REQUEST_URI}.hr [L,R=302]

  RewriteCond %{HTTP:Accept-Language} ^en.*$ [NC]
  RewriteCond %{REQUEST_URI} ^.*(js|css)$ [NC]
  RewriteRule ^(.*)$ %{REQUEST_URI}.en [L,R=302]

  # (...) do it for all languages       

  ErrorDocument 404 /index.php
</Directory>
于 2014-10-06T05:53:57.737 回答