June 21st, 2015

манул

есть многое на свете, друг Горацио...

У меня на домашнем компьютере стоит копия моего сайта. До недавнего времени я пользовался пакетом Denwer для PHP и mySQL, но этот пакет был устаревшим и меня заколебал. Поэтому недавно я сделал всё по науке: поставил apache (2.4.12) и mySQL как виндовые сервисы, ещё кое-что похимичил с PHP и т.д. Всё вроде бы работает как надо. НО!

Сегодня совершенно случайно я заметил, что на локальной копии "Энциклопедии марксизма" наблюдается глюк при переходе на ссылку "О произведениях" — передаётся неверный адрес и страница не открывается. Сразу скажу, что на рабочем сервере всё совершенно нормально, глюк вылез именно на локальной машине.

В общем, меня как программиста это заело, и я полдня сегодня просидел у домашнего компьютера, пытаясь выяснить, в чём дело. Как это зачастую в нашей профессии бывает, глюк я исправил (обошёл), но так и не понял окончательной причины. Суть вот в чём: там подключён модуль mod_rewrite, который преобразует удобочитаемые url-и в вызов главного скрипта pmwiki.php с параметрами. В .htaccess написано такое правило:

RewriteRule ^([A-Z0-9\xa0-\xff].*)$ pmwiki.php?n=$1 [QSA,L]

Вроде по логике всё правильно (начальный префикс регулярного выражения тут по специальным причинам, но дело не в нём). Но когда в url присутствует русская буква "х", она съедается! А точнее, съедается второй её байт из юникодного кода. Только и именно с этой буквой. Почему, я так и не понял, гугление не помогло. Съедается именно при подстановке в $1.

Ну, я это дело исправил, тупо добавив перед этим правилом правило

RewriteRule ^([A-Z0-9\xa0-\xff].*)х$ pmwiki.php?n=$1х [QSA,L] #fix a bug on windows

(русская "х" там в utf-8). Т.е. если явно эту букву написать как в поиске, так и в замене, всё работает нормально. Но при подстановке найденного образца почему-то происходит вот такая фигня.

Что это было, Бэрримор? O_o