web-dev-qa-db-ja.com

MultiViewsを使用した言語のApacheコンテンツネゴシエーションの構成

ApacheでMultiViewsオプションを機能させて、リクエストで提供されたAccept-Languageに基づいてブラウザに返されるコンテンツを変更しようとしています。

私は次の構成を持っています:

Alias /multiviewstest "C:/MultiViews Test"

<Directory "C:/MultiViews Test">
    Options MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

私のC:\MultiViews Testディレクトリには、次のファイルがあります。

  • spam.html
  • foo.html.en

http://localhost/multiviewstest/spamをリクエストすると、spam.htmlの内容が返されます。リクエストとレスポンスのヘッダーは次のとおりです。

Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

Date: Fri, 08 May 2009 11:07:54 GMT
Server: Apache/2.2.10 (Win32)
Content-Location: spam.html
Vary: negotiate
TCN: choice
Last-Modified: Fri, 08 May 2009 10:48:34 GMT
Etag: "0-4-469645ec81e70;469645ff5a5d8"
Accept-Ranges: bytes
Content-Length: 4
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

Content-LocationVary、およびTCN応答ヘッダーは、MultiViewsが正しく開始されたことを示します。

ブラウザに言語を表示するための唯一の優先言語として英語を設定しました。リクエストにはAccept-Language enヘッダーが設定されます。 http://localhost/multiviewstest/foo.htmlをリクエストすると、404応答が返されます。言語ネゴシエーションのための Apacheのファイル命名規則 の理解に基づいて、foo.html.enファイルの内容が返されることを期待しています。

リクエストとレスポンスのヘッダーは次のとおりです。

Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

Date: Fri, 08 May 2009 11:08:39 GMT
Server: Apache/2.2.10 (Win32)
Content-Length: 221
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1

リクエストのアクセスログに表示される内容は次のとおりです。

127.0.0.1 - - [04/May/2009:10:28:24 +1200] "GET /multiviewstest/foo.html HTTP/1.1" 404 221

そしてエラーログから:

[Mon May 04 10:28:24 2009] [error] [client 127.0.0.1] Negotiation: discovered file(s) matching request: C:/MultiViews Test/foo.html (None could be negotiated).

言語のコンテントネゴシエーションが正しく開始されないのはなぜですか?見落としている設定はありますか?

6
Simon Lieschke

構成に適切な言語/拡張関係が存在しますか?

AddLanguage en .en
LanguagePriority en fr de
ForceLanguagePriority Fallback
2
WerkkreW

FWIW、適切なAddLanguageなどのディレクティブを使用して、同様の問題が発生しました。やがて、問題はPHP固有のものであることに気づきました。

何らかの理由で、FilesMatchディレクティブ内でSetHandlerを使用していました。

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

単純なAddTypeに切り替えると、問題が解決しました。

AddType application/x-httpd-php .php
2
metkat

metkatによる回答 私の問題の原因も示唆されました。しかし、私は別のアプローチを選択しました。これは私の設定が持っていたものです:

<FilesMatch ".+\.ph(p[345]?|t|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>

そして、これは私がそれを変更したものです:

<FilesMatch ".+\.ph(p[345]?|t|tml)(\.[a-z]{2}|)$">
    SetHandler application/x-httpd-php
</FilesMatch>

基本的にファイル名の最後に追加しました:(\.[a-z]{2}|)、これは「...後にドットと範囲a-zの2文字が続くOR(|)何もない」。これまでのところスムーズに動作しているようです:)

0
Izzy