问题标签 [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.
apache - 如果 UA 请求它,则使用 mod_negotiation 来服务 webp
如果浏览器支持,是否可以使用 mod_negotiation 来提供 webp 图像,否则可以使用 jpg?
例如,如果我链接到路径为 /images/test 的图像,如果 UA 知道 webp,它会提供在 /images/test.webp 中找到的图像,否则会提供 jpg?
我试过四处寻找,但似乎 Chrome 中的 Accept 标头至少看起来像Accept:*/*
,而不是指定图像类型。
如果这不是这样做的方法,有没有人有任何其他建议?
.htaccess - 通过 MultiViews 选择语言仅在请求其他资源时部分起作用
我有一个小网站,可以根据以下标准(优先顺序递增)选择不同的语言:
Accept-Language
浏览器发送的- 指定首选语言的 cookie
- 最后包含语言首选项的请求路径
该站点本身仅包含静态 HTML 页面,并且我希望尽可能保持这种状态。我通过 和以下文件(缩短为省略语言和字符集的声明)实现了mod_negotiation
语言mod_rewrite
选择.htaccess
:
自八月左右以来一直运行良好,以允许以下情况:
- 不存在 cookie,
Accept-Language
接管(感谢MultiViews
) - Cookie 存在,将使用 cookie 的语言 (
prefer-language
) - 请求路径是
/es
或类似的,将用于 (a) 设置 cookie 和 (b) 设置prefer-language
为该值。
现在,我在网站上还有一些资源,多亏了MultiViews
,可以通过/resource
而不是/resource.html
内容协商来选择这些资源,并且 cookie 选项仍然可以很好地在此处选择适当的语言。
现在我想扩展 URI 处理,以便/resource/en
直接选择特定语言的资源等工作,这样这不仅适用于/
. 我尝试了以下方法RewriteRule
:
并且它可以在发送正确的资源并设置正确的 cookie 的情况下工作,但显然不再从环境变量中获取首选语言。现在唯一强制选择语言的是 cookie,但这仍然与之前的请求相同,因此在刷新页面之前我不会看到新语言。到目前为止,我对规则所做的任何尝试都不会影响这种行为。有趣的是,使用这条规则,上面记录的旧行为仍然可以正常工作。只有当我要求不同的东西时/
,它才会做奇怪的事情。
这是在共享主机上(在 FreeBSD 监狱内),所以我无法启用重写日志(因为我什至不知道文件所在的物理路径);此外,它显然似乎忽略了环境变量,并且出于某种原因仅使用 cookie 设置首选语言。到目前为止,我还没有弄清楚为什么。有什么帮助吗?
apache - (Jekyll?)自动 i18n(使用 Apache 的 mod_negotiation)?
我能说流利的法语和英语。我希望我的网站以任何一种语言显示,具体取决于访问者的语言设置。作为记录,此信息由访问者的浏览器提供,即Accept-Language
HTTP 标头。
据我所知,实现这一目标的最佳(也是唯一?)方法是使用 Apache 的mod_negotiation。考虑以下树结构:
访问page.html
以英语或法语显示页面。我想使用一个使用这种 i18n 方法的 CMS。
我正在考虑在我的网站上使用Jekyll。2013-06-04-Omelette-du-fromage.markdown.en
在下面的目录结构中,我想我需要用法语和英语(等)编写我的包含、布局和帖子。
所以,问题是:如何使用 CMS 在我的网站上实现自动国际化?我几乎无法想象自己会手动编写我所有的网站。
apache - 通过 Apache 为 Web 应用程序提供多语言静态内容
我有一些希望通过 Apache 提供的多语言静态内容。这些文件是应用程序生成的 JIT 缓存文件,因此如果它们存在,则应该提供它们,否则将请求转发给应用程序,应用程序将就地创建它们。
我通过 HTTP 的Accept-Language
标头指定语言,它可以是hr
, en
, 也可以是en-US,en;q=0.5
(因此没有简单的“将语言附加到文件名以继续”)。
网址如下:
在我的应用程序中,我有一个布局完全相同的文件夹,仅附加了语言,如下所示:
我已经弄清楚了Accept-Language
我需要的解析mod_negotiation
并想出了这个:
它有效,但仅适用于第一次错过。所以
- 如果我请求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
解析部分) - 预先生成所有文件(这似乎是一个巨大的拖累)
有第四种方法还是我缺少的东西?
编辑:根据接受的答案的完整解决方案
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:”。