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-Location
、Vary
、および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).
言語のコンテントネゴシエーションが正しく開始されないのはなぜですか?見落としている設定はありますか?
構成に適切な言語/拡張関係が存在しますか?
AddLanguage en .en
LanguagePriority en fr de
ForceLanguagePriority Fallback
FWIW、適切なAddLanguageなどのディレクティブを使用して、同様の問題が発生しました。やがて、問題はPHP固有のものであることに気づきました。
何らかの理由で、FilesMatchディレクティブ内でSetHandlerを使用していました。
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
単純なAddTypeに切り替えると、問題が解決しました。
AddType application/x-httpd-php .php
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(|
)何もない」。これまでのところスムーズに動作しているようです:)