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

1

Eu uso bastante a diretiva virtual() do PHP em um dos meus sites, incluindo elementos centrais. Isso funcionou bem durante os últimos ~ 10 anos - mas depois de atualizar (ou melhor, mover-se, como está em uma nova máquina) para o Ubuntu 12.04, ele de alguma forma quebrou.

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é terminou 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 um "último ressort", mudei o comando PHP para <? virtual("central/foobar.html"); ?> - e esse mesmo arquivo foi de fato incluído. Portanto, a função virtual() do PHP basicamente funcionou - mas o material dependente da linguagem obviamente não funcionava mais como antes.

Como a "tagarelice binária" mencionada acima me deixou curioso, copiei e colei em um arquivo chamado foo.gz e executei gzip -d foo.gz . Como já se suspeitava, isso não gerou nenhuma mensagem de erro (embora a saída ainda fosse algo sem sentido - apenas um jargão 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 foi ativado na nova máquina. Então eu removi isso dos mods habilitados (simplesmente apagando os links simbólicos), o problema do Apache ... recarregado parecia resolvido: o virtual do PHP agora incluía a variante correta do idioma. Mas o Firefox agora se recusa a exibir os conjuntos de quadros (se a chamada virtual() estivesse na parte alternativa), mas simplesmente se comporta como se não suportasse mais - embora eles apareçam bem na fonte ( Ctrl - U - mas com o conteúdo do arquivo "virtual" incluído movido na frente da tag <HEAD> !). Tentando novamente com o nome completo do arquivo em virtual("central/foobar.html") , o conjunto de quadros foi interpretado corretamente novamente (e o conteúdo incluído está no lugar correto).

Estou totalmente confuso agora.

Claro que tentei encontrar alguma mudança, 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 ...

    
por Izzy 12.11.2012 / 23:41

1 resposta

1


I believe your problem to be the apache configuration.

Troubleshooting tips:
  - check if mod_negotiation is loaded 
  - check that Multiview Option is enabled 
  - The default is to map headers like the language to something known by mod_mime, so check you have stuff like:
    AddLanguage de .de
    AddLanguage en .en
  - check what your browser is sending in the headers. Try duplicating it with curl

Alternatives:
  - Use mod_rewrite to rewrite the URL to the correct file and the virtual calls should work.
  - Try configuring the mime map manually:
    AddHandler type-map var
    Create a file named foobar.var with the following content:
    URI: foobar.html
    Content-Type: text/html
    Content-Language: en

    URI: foobar.html.de
    Content-Type: text/html
    Content-Language: de

    Check what happens when you access the foobar.var file.

    
por 13.11.2012 / 00:41