我有一些希望通过 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>
它有效,但仅适用于第一次错过。所以
- 如果我请求http://www.example.com/static/homepage.html,
Accept-Language: hr
它将创建homepage.html.hr
(正确) - 现在,如果我请求http://www.example.com/static/homepage.html,
Accept-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>