Назад | Перейти на главную страницу

Apache + PHP в путях с диакритическими буквами

Я не могу запустить веб-сайт с поддержкой PHP под Apache в Windows XP, если путь к DOCUMENT_ROOT содержит буквы с диакритическими знаками. Я имею в виду не сами имена файлов скриптов, а любую папку в компонентах пути.

У меня есть определение виртуального хоста:

<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>

... однако PHP жалуется при загрузке любого * .php файла (даже пустого):

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

Я решил попробовать короткое имя каталога 8 + 3 (просто тест, я не хочу использовать такой обходной путь):

<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>

Но у меня такое же поведение:

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

Хотя есть очевидные обходные пути (используйте простой ASCII во всех именах каталогов или создавайте NTFS-соединения, чтобы скрыть настоящие имена), я не могу поверить, что это невозможно. У вас есть дополнительная информация по теме?

Мои спецификации включают 32-битную Windows XP Professional SP3, Apache / 2.2.13 и PHP / 5.2.11, работающие как модуль Apache (но я заметил ту же проблему в другом окне с Windows Vista и PHP / 5.3.1).

Обновить

Я использую NTFS, а кодовая страница Windows - Win-1252 (это версия Windows на испанском языке). Возможно, актуально: -?

Обновление # 2

Замечу, что у меня нет проблем с PHP, включая или требующий, include_path или любой другой фрагмент кода PHP. Моя проблема в том, что интерпретатор PHP не найдет сам сценарий PHP, даже если это статический HTML-документ с расширением * .php.

Обновление # 3

При дальнейшем чтении выясняется, что PHP не использует двухбайтовые функции, предоставляемые Windows API.. Если я не ошибся, это, кажется, доказывает, что то, что я хочу делать, просто невозможно.

Кажется, что Apache разрешает путь к своей длинной версии, прежде чем передать его PHP в кодировке UTF-8. Файловые функции PHP используют ANSI API Windows и не могут работать с Unicode в именах файлов.

Я помню, как столкнулся с аналогичной проблемой с Apache / PHP. Одним из решений было бы создать какую-то символическую ссылку NTFS на вашу папку, используя имя, которое полностью избегает символов Unicode.

например: E: \ sites => E: \ gonzález \ sites

Символическая ссылка NTFS в Википедии: http://en.wikipedia.org/wiki/NTFS_symbolic_link

Вы можете получить утилиту mklink.exe от Microsoft для создания таких ссылок из командной строки: http://technet.microsoft.com/en-us/library/cc753194(WS.10).aspx

Вы можете попробовать следующую команду:

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

Link Shell Extension - это бесплатное программное обеспечение, которое интегрируется с оболочкой Windows для управления символическими ссылками на томах NTFS (вы найдете ссылку в статье Википедии выше, или вы можете найти «Link Shell Extension» в любой хорошей поисковой системе).

У меня отлично работает с Apache/2.2.8 и PHP/5.2.5 в Соединенном Королевстве, require() закодировано в ANSI/UTF-8/UTF-8 +BOM.

Я просто скопировал твой пример (E:/gonzález/) с этой страницы, создал тестовый скрипт (ANSI, работал нормально) затем протестировал различные кодировки. Может быть, вы могли бы попробовать тот же метод?