问题标签 [mod-negotiation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1869 浏览

apache - 如果 UA 请求它,则使用 mod_negotiation 来服务 webp

如果浏览器支持,是否可以使用 mod_negotiation 来提供 webp 图像,否则可以使用 jpg?

例如,如果我链接到路径为 /images/test 的图像,如果 UA 知道 webp,它会提供在 /images/test.webp 中找到的图像,否则会提供 jpg?

我试过四处寻找,但似乎 Chrome 中的 Accept 标头至少看起来像Accept:*/*,而不是指定图像类型。

如果这不是这样做的方法,有没有人有任何其他建议?

0 投票
1 回答
361 浏览

.htaccess - 通过 MultiViews 选择语言仅在请求其他资源时部分起作用

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

  1. Accept-Language浏览器发送的
  2. 指定首选语言的 cookie
  3. 最后包含语言首选项的请求路径

该站点本身仅包含静态 HTML 页面,并且我希望尽可能保持这种状态。我通过 和以下文件(缩短为省略语言和字符集的声明)实现了mod_negotiation语言mod_rewrite选择.htaccess

自八月左右以来一直运行良好,以允许以下情况:

  1. 不存在 cookie,Accept-Language接管(感谢MultiViews
  2. Cookie 存在,将使用 cookie 的语言 ( prefer-language)
  3. 请求路径是/es或类似的,将用于 (a) 设置 cookie 和 (b) 设置prefer-language为该值。

现在,我在网站上还有一些资源,多亏了MultiViews,可以通过/resource而不是/resource.html内容协商来选择这些资源,并且 cookie 选项仍然可以很好地在此处选择适当的语言。

现在我想扩展 URI 处理,以便/resource/en直接选择特定语言的资源等工作,这样这不仅适用于/. 我尝试了以下方法RewriteRule

并且它可以在发送正确的资源并设置正确的 cookie 的情况下工作,但显然不再从环境变量中获取首选语言。现在唯一强制选择语言的是 cookie,但这仍然与之前的请求相同,因此在刷新页面之前我不会看到新语言。到目前为止,我对规则所做的任何尝试都不会影响这种行为。有趣的是,使用这条规则,上面记录的旧行为仍然可以正常工作。只有当我要求不同的东西时/,它才会做奇怪的事情。

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

0 投票
1 回答
317 浏览

apache - (Jekyll?)自动 i18n(使用 Apache 的 mod_negotiation)?

我能说流利的法语和英语。我希望我的网站以任何一种语言显示,具体取决于访问者的语言设置。作为记录,此信息由访问者的浏览器提供,即Accept-LanguageHTTP 标头

据我所知,实现这一目标的最佳(也是唯一?)方法是使用 Apache 的mod_negotiation。考虑以下树结构:

访问page.html以英语或法语显示页面。我想使用一个使用这种 i18n 方法的 CMS。


我正在考虑在我的网站上使用Jekyll2013-06-04-Omelette-du-fromage.markdown.en在下面的目录结构中,我想我需要用法语和英语(等)编写我的包含、布局和帖子。


所以,问题是:如何使用 CMS 在我的网站上实现自动国际化?我几乎无法想象自己会手动编写我所有的网站。

0 投票
2 回答
636 浏览

apache - 通过 Apache 为 Web 应用程序提供多语言静态内容

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

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

网址如下:

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

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

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

  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解析部分)
  • 预先生成所有文件(这似乎是一个巨大的拖累)

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

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

0 投票
2 回答
2237 浏览

apache - 让 Apache 自动解压缩文件,但仅在需要时

我想将我的网络服务器的所有静态文件保存在本地压缩,并根据请求为它们提供压缩或不压缩。

如何在 Apache 2.x 中使用 mod_deflate 预压缩文件foo.tar.gz, 很接近,因为确实通过启用 MultiViews 并使用正确的 AddEncoding,我可以让 Apache在我请求时从我的网络服务器返回压缩文件foo.tar,并且它带有正确的Content-Encoding:标题。

但这仅在客户端包含Accept-Encoding: gzip在它发送到服务器的标头中时才有效。OTOH,如果客户端不支持 gzip 编码,我的服务器只会告诉我foo.tar对我来说没有“可接受的”。

如果我使用AddOutputFilter INFLATE tar. 但是如果我这样做,那么服务器也会在我请求时foo.tar.gz(或者当我指定我接受 gzip 编码时)解压缩内容,这显然是我不想要的。

那么,当客户端不支持 gzip 内容编码但在其他情况下提供预压缩文件时,如何让 Apache 解压缩文件?

编辑:根据@covener 的建议,我尝试了以下方法:

[ 在这里使用 Apache-2.2.22。] 但结果实际上比仅使用前三行更糟糕:当我请求 .tar.gz 文件时,它现在返回时没有“Content-Encoding:”,当我请求 .tar 文件时,我收到tar.gz 的内容(即仍然压缩),无论“Accept-Encoding:”标头如何,并且仍然没有“Content-Encoding:”。