PHP 'virtual' com o Apache MultiViews não funcionando após a atualização para 12.04

1

Eu uso bastante a diretiva virtual() do PHP em um dos meus sites, incluindo elementos centrais. Isso funcionou bem nos últimos 10 anos - mas depois de atualizar para o 12.04, de alguma forma ele foi quebrado.

Exemplo de configuração (simplificado)

Para facilitar o entendimento, simplifico algumas coisas (conteúdo). Então, eu digo que preciso de um fragmento HTML como <P>For further instructions, please look <A HREF='foobar'>here</P> em várias páginas. 10 anos atrás, eu usei o SSI para isso, então ele é colocado em um arquivo em um lugar central - então se, por exemplo, as alterações de URL segmentadas, eu só preciso atualizá-lo em um só lugar. Para servir vários idiomas, tenho o MultiViews habilitado do Apache - e em $DOCUMENT_ROOT/central/ estão os arquivos:

  • foobar.html (variante em inglês e o padrão)
  • foobar.html.de (variante alemã).

Agora no código PHP, eu simplesmente coloquei:

<? virtual("/central/foobar"); ?>

e deixe o Apache tomar cuidado para entregar a variante de idioma correta.

O problema

Como dito, isso funcionou bem por cerca de 10 anos: os visitantes alemães obtiveram a variante alemã, todos os outros, o inglês (dependendo do idioma preferido). Mas depois de atualizar para o Ubuntu 12.04, ele não funcionou mais: ou nada foi entregue a partir do comando virtual() , ou (em conexão com conjuntos de quadros) ele até acabou em código binário.

Tentando descobrir o que acontece, eu brinquei com muitas coisas. Primeiro, achei que MultiViews não estava (de alguma forma) disponível, mas chamar http://<server>/central/foobar mostrou a variante correta, dependendo das preferências de idioma configuradas. Isso também provou que não havia nada de errado com as permissões de arquivo. O error.log também não deu pistas (nenhuma mensagem de erro foi lançada).

Finalmente, apenas como uma "última ressort", mudei o comando PHP para <? virtual("central/foobar.html"); ?> - e esse mesmo arquivo foi de fato incluído. Mas as coisas dependentes da linguagem obviamente não funcionavam mais.

É claro que tentei encontrar alguma alteração (provavelmente no comando virtual() do PHP), usando muito o Google e também pesquisando as questões aqui - infelizmente sem sucesso.

Finalmente: a questão

Colocando "questões de design" de lado (certamente hoje eu projetaria as coisas de forma diferente - mas pelo menos atualmente sinto falta do tempo para mudar isso para uma quantidade enorme de páginas): O que pode ser feito para que funcione de novo? Eu certamente perdi alguma coisa - mas não consigo descobrir o que ...

Adição (EDIT)

Meu problema remanescente agora é que, assim que o documento precisar ser negociado (por exemplo, tem diferentes variantes de idioma), virtual() sempre adiciona o conteúdo no início do documento gerado (ou seja, na frente do <HTML> tag) - independentemente de onde foi colocado. No entanto, é colocado corretamente quando nenhuma negociação está envolvida.

Alguma ideia do que está acontecendo lá e como consertá-lo?

    
por Izzy 11.11.2012 / 20:48

1 resposta

1

Como o "jargão binário" mencionado acima me deixou curioso, investiguei um pouco mais e copiei-o em um arquivo chamado foo.gz e executei gzip -d foo.gz . Como já se suspeitava, isso não produzia nenhuma mensagem de erro (embora a saída ainda fosse algo sem sentido - apenas um conteúdo diferente). Comparando o /etc/apache2/mods-enabled em minha nova máquina com uma configuração semelhante em uma máquina mais antiga, o mod_deflate está ativado na nova máquina. Então eu removi isso dos mods habilitados (simplesmente apagando os links simbólicos deflate.conf e deflate.load ), recarreguei o Apache ... problema resolvido. Pelo menos parece ...

Editar:

Apenas a "parte sem sentido" é resolvida desativando mod_deflate . Problema restante: assim que o link transmitido para virtual() acionar mod_negotiation (ou seja, a parte MultiViews ), o texto incluído será movido para o topo da saída (ou seja, na frente de a tag <HTML> ), que quebra a maioria das páginas. Se o link direcionado não precisar ser negociado, o texto incluído será colocado corretamente. Muito confuso.

    
por Izzy 12.11.2012 / 23:52