Apache + PHP em caminhos com letras acentuadas

4

Não consigo executar um site com PHP ativado no Apache no Windows XP se o caminho para DOCUMENT_ROOT contiver letras acentuadas. Não estou me referindo aos próprios nomes dos arquivos de script, mas a qualquer pasta nos componentes do caminho.

Eu tenho essa definição de host virtual:

<VirtualHost *:80>
 ServerName foo.local
 DocumentRoot "E:/gonzález/sites/foo"

 ErrorLog logs/foo.local-error.log
 CustomLog logs/foo.local-access.log combined

 <Directory "E:/gonzález/sites/foo">
  AllowOverride All
  Options Indexes FollowSymLinks

  Order allow,deny
  Allow from all
 </Directory>
</VirtualHost>
  • Se eu salvar o arquivo em ANSI, recebo um erro de sintaxe: DocumentRoot deve ser um diretório
  • Se eu salvar o arquivo em Unicode, recebo outro erro de sintaxe: Comando inválido '\ xff \ xfe #', talvez escrito incorretamente ou definido por um módulo não incluído na configuração do servidor (parece que é reclamando sobre o BOM)
  • Se eu salvar o arquivo no UTF-8 sem BOM, o Apache funciona bem e ele exibe arquivos estáticos sem nenhum problema aparente ...

... no entanto, reclamações do PHP ao carregar qualquer arquivo * .php (mesmo que vazio):

Warning:  Unknown: failed to open stream: No such file or directory in Unknown on line 0
Fatal error:  Unknown: Failed opening required 'E:/gonzález/sites/foo/vacio.php' (include_path='.;C:\Archivos de programa\PHP\pear') in Unknown on line 0

Eu decidi experimentar o nome abreviado 8 + 3 do diretório (apenas um teste, não quero usar essa solução alternativa):

<VirtualHost *:80>
 ServerName foo.local
 DocumentRoot "E:/GONZLE~1/sites/foo"

 ErrorLog logs/foo.local-error.log
 CustomLog logs/foo.local-access.log combined

 <Directory "E:/GONZLE~1/sites/foo">
  AllowOverride All
  Options Indexes FollowSymLinks

  Order allow,deny
  Allow from all
 </Directory>
</VirtualHost>

Mas obtenho o mesmo comportamento:

Warning:  Unknown: failed to open stream: No such file or directory in Unknown on line 0

Fatal error:  Unknown: Failed opening required 'E:/gonzález/sites/foo/vacio.php' (include_path='.;C:\Archivos de programa\PHP\pear') in Unknown on line 0

Embora existam soluções óbvias (use ASCII simples em todos os nomes de diretório ou crie junções NTFS para ocultar nomes reais), não posso acreditar que isso não possa ser feito. Você tem mais informações sobre o assunto?

Minhas especificações incluem Windows XP Professional SP3 de 32 bits, Apache / 2.2.13 e PHP / 5.2.11 executando como módulo do Apache (mas notei o mesmo problema em outra caixa com o Windows Vista e PHP / 5.3.1) .

Atualizar

Estou usando o NTFS e a página de códigos do Windows é Win-1252 (é uma versão em espanhol do Windows). Talvez seja relevante: -

Atualização nº 2

Eu observo que não estou tendo problemas com o PHP inclui ou requer, include_path ou qualquer outro código PHP. Meu problema é que o interpretador PHP não encontrará o próprio script PHP, mesmo que seja um documento HTML estático com a extensão * .php.

Atualização 3

Após a leitura, aparece o PHP não use as funções de byte duplo fornecidas pela API do Windows . A menos que eu tenha entendido errado, isso parece provar que o que eu quero fazer é simplesmente impossível.

    
por Álvaro González 17.03.2010 / 11:37

2 respostas

5

Parece que o Apache resolve o caminho para sua versão longa antes de passá-lo para o PHP codificado em UTF-8. As funções de arquivo PHP usam a API ANSI do Windows e não conseguem lidar com Unicode em nomes de arquivos.

Lembro-me de enfrentar um problema semelhante com o Apache / PHP. Uma solução seria criar um tipo de link simbólico do NTFS para sua pasta usando um nome que evite apenas caracteres Unicode.

por exemplo: E: \ sites = > E: \ gonzález \ sites

Link simbólico NTFS na Wikipedia: link

Você pode obter o utilitário mklink.exe da Microsoft para criar esses links a partir da linha de comando: link

Você pode tentar o seguinte comando:

mklink /D E:\sites E:\gonzález\sites

Link Shell Extension é um software gratuito que se integra ao shell do Windows para gerenciar links simbólicos em volumes NTFS (você encontrará o link no artigo da Wikipedia acima, ou você pode procurar por "Link Shell Extension" em qualquer bom mecanismo de busca ).

    
por 27.02.2011 / 06:17
1

Funciona muito bem para mim com Apache/2.2.8 e PHP/5.2.5 no Reino Unido, require() codificado em ANSI / UTF-8 / UTF-8 +BOM .

Acabei de copiar seu exemplo ( E:/gonzález/ ) desta página, criei o script de teste ( ANSI , funcionou bem) e testei as várias codificações. Talvez você possa tentar o mesmo método?

    
por 17.03.2010 / 13:22