Configurando a negociação de conteúdo do Apache para idiomas usando MultiViews

6

Estou tentando obter a opção MultiViews funcionando no Apache para variar o conteúdo retornado ao navegador com base no Accept-Language fornecido nas solicitações.

Eu tenho a seguinte configuração:

Alias /multiviewstest "C:/MultiViews Test"

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

No meu diretório C:\MultiViews Test , tenho os seguintes arquivos:

  • spam.html
  • foo.html.en

Quando eu solicito http://localhost/multiviewstest/spam , o conteúdo de spam.html é retornado. Aqui estão os cabeçalhos de solicitação e resposta:

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

Os cabeçalhos de resposta Content-Location , Vary e TCN indicam que MultiViews foi corretamente kickado.

Configurei o inglês como o único idioma preferido para exibir idiomas no meu navegador. Um Accept-Language en header é definido em pedidos. Quando solicito http://localhost/multiviewstest/foo.html , uma resposta 404 é retornada. Com base no meu entendimento das convenções de nomenclatura de arquivos do Apache para negociação de idioma , eu esperaria o conteúdo do arquivo foo.html.en a ser retornado.

Aqui estão os cabeçalhos de solicitação e resposta:

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

Veja o que aparece no log de acesso da solicitação:

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

E no log de erros:

[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).

Por que a negociação de conteúdo para o idioma não está funcionando corretamente? Existe alguma configuração que negligenciei?

    
por Simon Lieschke 02.05.2009 / 12:22

3 respostas

2

As relações de idioma / extensão adequadas existem na sua configuração?

AddLanguage en .en
LanguagePriority en fr de
ForceLanguagePriority Fallback
    
por 14.05.2009 / 04:52
2

FWIW, me deparei com um problema semelhante, com as diretivas apropriadas do AddLanguage etc. Eventualmente, percebi que o problema era específico do PHP.

Por algum motivo, eu estava usando o SetHandler dentro de uma diretiva FilesMatch:

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

Mudar para um AddType simples resolveu o problema:

AddType application/x-httpd-php .php
    
por 01.09.2010 / 00:36
0

A resposta dada pela metkat também indicava a origem do meu problema. No entanto, decidi por uma abordagem diferente. Isto é o que minha configuração tinha:

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

E é nisso que eu mudei:

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

Eu basicamente adicionei ao final do nome do arquivo: (\.[a-z]{2}|) , que significa "... seguido por um ponto e dois caracteres do intervalo a-z OR ( | ) nada". Parece funcionar sem problemas até agora:)

    
por 26.09.2013 / 22:59