問題タブ [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を提供しますか?
Accept:*/*
いろいろ調べてみましたが、ChromeのAcceptヘッダーは、画像の種類を指定するのではなく、少なくとものように見えます。
これがそれを行う方法ではない場合、誰か他の提案がありますか?
.htaccess - MultiViews による言語選択は、別のリソースをリクエストするときに部分的にしか機能しません
次の基準に基づいて選択されたさまざまな言語で利用できる小さなサイトがあります (優先順位の昇順)。
Accept-Language
ブラウザから送信された- 優先言語を指定する Cookie
- 最後に言語設定を含むリクエスト パス
サイト自体は静的な HTML ページのみで構成されており、可能な限りそのままにしておきたいと考えています。mod_negotiation
、mod_rewrite
および次の.htaccess
ファイル (言語と文字セットの宣言を省略するために短縮されています)を介して言語選択を実装しました。
これは、8 月以降、次のことを可能にするために正常に機能しています。
- Cookie が存在しないため、
Accept-Language
引き継ぎます (のおかげでMultiViews
) - Cookie が存在します。Cookie の言語が使用されます (
prefer-language
) - リクエスト パスは
/es
または類似しており、(a) Cookie を設定し、(b)prefer-language
その値を設定するために使用されます。
現在、私はサイトにさらにいくつかのリソースを持ってMultiViews
い/resource
ます/resource.html
.
/resource/en
ここで、URI 処理を拡張して、特定の言語でリソースを直接選択するようなことができるようにしたいと考えました/
。私は次のことを試しましたRewriteRule
:
正しいリソースが送信され、正しいCookieが設定されている限り機能しますが、優先言語は環境変数から取得されないようです。現在、言語の選択を強制しているのは Cookie だけですが、それは以前と同じ要求であるため、ページを更新するまで新しい言語は表示されません。これまでのところ、ルールで試したことは、その動作に影響を与えませんでした。興味深いことに、このルールを使用しても、上記の古い動作は問題なく機能します。/
奇妙なことをするのとは違う何かを要求した場合にのみです。
これは共有ホスティング (FreeBSD 刑務所内) にあるため、書き換えログを有効にすることはできません (ファイルの物理パスさえわからないため)。さらに、環境変数を無視し、何らかの理由で優先言語を設定するためにのみ Cookie を使用しているように見えます。で、その理由は今のところわかりません。何か助けはありますか?
apache - (Jekyll?) 自動 i18n (Apache の mod_negotiation を使用)?
私はフランス語と英語で流暢に話します。訪問者の言語設定に応じて、Web サイトをいずれかの言語で表示したいと考えています。記録として、この情報は訪問者のブラウザであるAccept-Language
HTTP ヘッダーによって提供されます。
私の知る限り、それを達成するための最良の (そして唯一の?) 方法は、Apache のmod_negotiationを使用することです。次のツリー構造を考慮します。
訪問page.html
すると、ページが英語またはフランス語で表示されます。この i18n 方式を利用した CMS を使用したいと考えています。
ウェブサイトにJekyllを使用することを検討しています。2013-06-04-Omelette-du-fromage.markdown.en
以下のディレクトリ構造では、インクルード、レイアウト、および投稿をフランス語と英語 (など)の両方で記述する必要があると思います。
問題は、CMS を使用して Web サイトに自動国際化を実装するにはどうすればよいかということです。自分のウェブサイトをすべて手書きで書いている自分を想像することはほとんどできません。
apache - Apache を介した Web アプリケーション用の多言語静的コンテンツの提供
Apache 経由で提供したい多言語の静的コンテンツがいくつかあります。ファイルは、アプリによって JIT で生成されたキャッシュ ファイルであるため、存在する場合はそれらを提供する必要があります。
HTTP のAccept-Language
ヘッダーを介して言語を指定します。これはhr
, en
, でもありますen-US,en;q=0.5
(そのため、単純な「言語をファイル名に追加して続行する」ことはできません)。
URL は次のようになります。
私のアプリには、まったく同じレイアウトのフォルダーがあり、次のように言語のみが追加されます。
私は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
解析部分がありません) - すべてのファイルを事前に生成する (これは非常に面倒なようです)
4番目の方法または私が見逃しているものはありますか?
編集:受け入れられた回答による完全なソリューション
apache - Apache にファイルを自動解凍させますが、必要な場合のみです
Web サーバーのすべての静的ファイルをローカルで圧縮しておき、要求に応じて圧縮または非圧縮で提供したいと考えています。
How can I pre-compress files with mod_deflate in Apache 2.x?の回答 実際、MultiViews を有効にし、適切な AddEncoding を使用することで、Apache がfoo.tar.gz
を要求したときに Web サーバーから圧縮ファイルを返してくれるので、適切なヘッダーfoo.tar
が付属しています。Content-Encoding:
ただし、これは、クライアントがAccept-Encoding: gzip
サーバーに送信するヘッダーに含まれている場合にのみ機能します。OTOH クライアントが gzip エンコーディングをサポートしていない場合、サーバーは「受け入れられる」ものがないことを通知しfoo.tar
ます。
を使用すれば、送信する前に Apache にその tarball を解凍させることができますAddOutputFilter INFLATE tar
。しかし、それを行うと、サーバーは要求時にfoo.tar.gz
(または gzip エンコーディングを受け入れるように指定したときに) コンテンツも解凍しますが、これは明らかに望ましくありません。
では、クライアントが gzip content-encoding をサポートしていない場合に Apache にファイルを解凍させ、それ以外の場合には圧縮前のファイルを提供させるにはどうすればよいでしょうか?
編集: @covener の提案に基づいて、次のことを試しました。
[ ここでは Apache-2.2.22 を使用。] しかし、結果は実際には最初の 3 行だけよりも悪くなります: .tar.gz ファイルを要求すると、"Content-Encoding:" なしで返され、.tar ファイルを要求すると、 「Accept-Encoding:」ヘッダーに関係なく、「Content-Encoding:」がなくても、tar.gz のコンテンツ (つまり、まだ圧縮されている)。