Настройка согласования содержимого Apache для языков с использованием MultiViews

Я пытаюсь получить MultiViews возможность работы в Apache для изменения содержимого, возвращаемого в браузер, на основе 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).

Почему не согласовывается содержание контента для языка? Есть какая-то конфигурация, которую я пропустил?

3 ответа

Решение

Существуют ли правильные отношения язык / расширение в вашей конфигурации?

AddLanguage en .en
LanguagePriority en fr de
ForceLanguagePriority Fallback

FWIW, я столкнулся с подобной проблемой, с правильными директивами AddLanguage и т. Д. На месте. В конце концов я понял, что проблема связана с PHP.

По какой-то причине я использовал SetHandler в директиве FilesMatch:

<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}|), что означает "... за которым следует точка и два символа диапазона az ИЛИ (|) ничего ". Кажется, до сих пор работает гладко:)

Другие вопросы по тегам