Время от времени каждый из нас может вспомнить ситуации, когда ну вот всё правильно делаешь, а система «чудит». Бьешься, пытаешься найти проблему, уже и консиллиум вокруг себя собрал — никто не может понять, в чем дело, а потом проходит какое время и наступает озарение. И понимаешь, что сглупил, что вот она, ошибка. На поверхности лежала. Потом такие байки можно в профессиональной тусовке рассказывать.
Маленький оффтопик с программерской тематики на жизненную. Лет семь назад со мной в Турции, в отеле, произошла забавная ситуация. Мне понадобилось зачем-то погладить там футболку и я пытался сформулировать глубокую мысль на английском, ну как мог. На ресепшене его тоже знали не очень, они пытались меня понять.
— Ту а’йрон, ай ниид ту айрон, — говорю я девушке. To iron. To — iron. White t-shirt. To iron. Она машет головой: «Ок, ок, мистер!». Спросила, буду ли я в комнате у себя. Да, отвечаю, где ж мне еще быть-то с утюгом.
Сижу в комнате. Тут стук в дверь, открываю ее и чуть не грохаюсь на пол. На меня смотрит турецкий мужчина и ничего не понимает. В руках держит поднос, на котором два айрана.
Вот такие ситуации иногда происходят и с компами, и в программировании, и в администрировании. Началось все с чужой истории про почту, которая не ходила дальше 500 миль. Я опубликовал ее на ЖЖ еще в 2003 году, так на нее до сих пор посещение заметное. Видимо, трогает тема людей, да.
На домашнем ноуте (macbook) у меня вдруг заклинило мышь. Двигаешь курсор мыши, а он с собой окошки утаскивает. Перегружаю комп (это уже не просто сделать было без мыши), секунд пять работает как надо, а потом опять такая же фигня. Вот ни с того, ни с сего же. Работала ведь минуту назад! Ничего не ставил и не записывал на диск, не изменял. Просто на пустом месте рраз! — и не работает. И ведь даже сделать ничего нельзя, мышь не работает, с клавиатуры толку мало на макоси. За пять секунд в начале, конечно, ничего не успеваешь. Я сломал всю голову, что бы это могло быть.
И тут я перешел на кухню. Тачпад заработал. Сам собой. Уфф, подумал я, чудеса случаются, но все, проблема в прошлом, и вернулся к разбору почты.
Вечером я вернулся обратно в комнату с ноутом. Ну ёлки палки, опять. Кое-где проступил мат.
Пришла мысль вернуться на кухню. Я ее отогнал, потому что это бред. Но она не отступала. Вернулся. Ура курсорчик задвигался!!! Вернулся в комнату — опять заблокирован.
Я уже подумал о дозиметре, ей богу.
Сел и стал думать. И понял.
Вы будете смеяться. Дети игрушками прижали кнопку блютусной мыши в углу комнаты, о которой я уже вообще забыл — как-то тачпадом было удобнее. До кухни блютус уже не добивал.
Так вот, всё это есть вступление к теме сегодняшней заметки. Тема будет про сайт. Вот не поверите, я вспомнил и о мыши, о об айране, когда вчера вечером пытался понять, what the fuck.
Я сейчас делаю прототип сайта, такой быстрый наколеночный прототип сайта и онлайн-версии к своей игре Wordrive. Игра сейчас на ревизии в Apple, через недельки две запустится. Прототип призван проверить несколько технологий и эту благородную миссию он уже выполнил. Но иногда надо его чинить, пока он всё еще прототип.
Сайт работает на базе RewriteEngine — это такая технология от Apache, позволяющая, в частности, преобразовывать адреса вида /folder1/folder2/ в что-то типа /script.php?param=/folder1/folder2. У меня было настроено так, что не преобразовывает она только в одном случае — если ресурс, на который указывает путь, действительно существует. Это позволяет обращаться к картинкам, например, /img/picture.png и этот путь не будет «скормлен» скрипту script.php. Потому что там стоит специальная строчечка.
Давайте я все-таки полное содержание .htaccess приведу:
В script.php у меня есть условие, типа следующего,
И тут я вижу, что при ОДНОМ обращении в браузер, в лог пишется ДВЕ строки. Двоечка и единичка.
Я протер глаза. Попробовал еще раз. Стер лог-файл. Вписал в браузер в режиме «инкогнито» вызов, открыл инструментарий разработчика, проверил, что запрос один. ТО ЖЕ САМОЕ. В логе две строки. 2 и 1. Жаль, нет доступа к access-логам, посмотрел бы еще там. Но его нет.
Хорошо, подумал я, это проблема хостинга. Там, наверное, неправильно обрабатывают запросы. У них уровнем выше есть .htaccess уровня сервера и там тоже есть правила. Наверное, обрабатываются два раза. И написал им заявку.
Вместе с хостингом мы убедились, что:
Ребята из хостинга возились три часа. В итоге прислали письмо:
Это письмо я получил дома, в шесть утра. Пока ехал на работу, я понял, в чем проблема. Но стоило еще все проверить.
Как я и ожидал, дело оказалось в favicon.ico. Браузер посылает запрос на этот файл параллельно с запросом на скрипт. Google Chrome это делает с каждым запросом. Firefox, наверное, однажды получив вместо иконки кусок моего HTML из скрипта, понял, что что-то не так и больше не обращался. А Chrome настойчив — он дергает этот файл. Это и по логам оказалось так. А файла favicon.ico, конечно, на сайте не было. И тут срабатывало правило — надо его перенаправлять на скрипт, /script.php?param=favicon.ico Внутри логика шла по другому пути, и запись в лог срабатывала, а все отладочные echo выводились только для второго запроса.
Кстати, для прототипа сервиса my.wordrive.com меня порадовала задача написания функции перевода из десятичной в62-ричную систему и обратно. Ведь появляются же такие задачи!.. И ведь без нее никак.
Вот за это я люблю программирование.
Маленький оффтопик с программерской тематики на жизненную. Лет семь назад со мной в Турции, в отеле, произошла забавная ситуация. Мне понадобилось зачем-то погладить там футболку и я пытался сформулировать глубокую мысль на английском, ну как мог. На ресепшене его тоже знали не очень, они пытались меня понять.
— Ту а’йрон, ай ниид ту айрон, — говорю я девушке. To iron. To — iron. White t-shirt. To iron. Она машет головой: «Ок, ок, мистер!». Спросила, буду ли я в комнате у себя. Да, отвечаю, где ж мне еще быть-то с утюгом.
Сижу в комнате. Тут стук в дверь, открываю ее и чуть не грохаюсь на пол. На меня смотрит турецкий мужчина и ничего не понимает. В руках держит поднос, на котором два айрана.
Вот такие ситуации иногда происходят и с компами, и в программировании, и в администрировании. Началось все с чужой истории про почту, которая не ходила дальше 500 миль. Я опубликовал ее на ЖЖ еще в 2003 году, так на нее до сих пор посещение заметное. Видимо, трогает тема людей, да.
На домашнем ноуте (macbook) у меня вдруг заклинило мышь. Двигаешь курсор мыши, а он с собой окошки утаскивает. Перегружаю комп (это уже не просто сделать было без мыши), секунд пять работает как надо, а потом опять такая же фигня. Вот ни с того, ни с сего же. Работала ведь минуту назад! Ничего не ставил и не записывал на диск, не изменял. Просто на пустом месте рраз! — и не работает. И ведь даже сделать ничего нельзя, мышь не работает, с клавиатуры толку мало на макоси. За пять секунд в начале, конечно, ничего не успеваешь. Я сломал всю голову, что бы это могло быть.
И тут я перешел на кухню. Тачпад заработал. Сам собой. Уфф, подумал я, чудеса случаются, но все, проблема в прошлом, и вернулся к разбору почты.
Вечером я вернулся обратно в комнату с ноутом. Ну ёлки палки, опять. Кое-где проступил мат.
Пришла мысль вернуться на кухню. Я ее отогнал, потому что это бред. Но она не отступала. Вернулся. Ура курсорчик задвигался!!! Вернулся в комнату — опять заблокирован.
Я уже подумал о дозиметре, ей богу.
Сел и стал думать. И понял.
Вы будете смеяться. Дети игрушками прижали кнопку блютусной мыши в углу комнаты, о которой я уже вообще забыл — как-то тачпадом было удобнее. До кухни блютус уже не добивал.
Так вот, всё это есть вступление к теме сегодняшней заметки. Тема будет про сайт. Вот не поверите, я вспомнил и о мыши, о об айране, когда вчера вечером пытался понять, what the fuck.
Я сейчас делаю прототип сайта, такой быстрый наколеночный прототип сайта и онлайн-версии к своей игре Wordrive. Игра сейчас на ревизии в Apple, через недельки две запустится. Прототип призван проверить несколько технологий и эту благородную миссию он уже выполнил. Но иногда надо его чинить, пока он всё еще прототип.
Сайт работает на базе RewriteEngine — это такая технология от Apache, позволяющая, в частности, преобразовывать адреса вида /folder1/folder2/ в что-то типа /script.php?param=/folder1/folder2. У меня было настроено так, что не преобразовывает она только в одном случае — если ресурс, на который указывает путь, действительно существует. Это позволяет обращаться к картинкам, например, /img/picture.png и этот путь не будет «скормлен» скрипту script.php. Потому что там стоит специальная строчечка.
Давайте я все-таки полное содержание .htaccess приведу:
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /script.php?param=$1 [L,QSA]
В script.php у меня есть условие, типа следующего,
clearlog();
$param = $_REQUEST['param'];
if ($param == "/folder1/folder2/")
{
// BLOCK A : process folder1 - folder2
writelog ('1');
} else
{
// BLOCK B :
writelog ('2');
}
И тут я вижу, что при ОДНОМ обращении в браузер, в лог пишется ДВЕ строки. Двоечка и единичка.
Я протер глаза. Попробовал еще раз. Стер лог-файл. Вписал в браузер в режиме «инкогнито» вызов, открыл инструментарий разработчика, проверил, что запрос один. ТО ЖЕ САМОЕ. В логе две строки. 2 и 1. Жаль, нет доступа к access-логам, посмотрел бы еще там. Но его нет.
Хорошо, подумал я, это проблема хостинга. Там, наверное, неправильно обрабатывают запросы. У них уровнем выше есть .htaccess уровня сервера и там тоже есть правила. Наверное, обрабатываются два раза. И написал им заявку.
Вместе с хостингом мы убедились, что:
- если стереть .htaccess или убрать оттуда RewriteEngine, — все работает,
- если воспользоваться Firefox — все работает,
- один хром у хостера тоже не выдал проблемы.
Ребята из хостинга возились три часа. В итоге прислали письмо:
Здравствуйте, Рауф.
Проблема, связанная с повторным исполнением скрипта, вызвана исключительно самим
браузером "Chrome" и не как не связанна с файлом ~/public_html/.htaccess.
Мы проверили Ваш скрипт на другой площадке, где в каталоге выше нет .htaccess.
Тоже самое возникает и там. Причем повторная строка возникает, если
открывать страницу через "Chrome". Например, если открыть страницу через
"FireFox", то подобной проблемы нет.
Это письмо я получил дома, в шесть утра. Пока ехал на работу, я понял, в чем проблема. Но стоило еще все проверить.
Как я и ожидал, дело оказалось в favicon.ico. Браузер посылает запрос на этот файл параллельно с запросом на скрипт. Google Chrome это делает с каждым запросом. Firefox, наверное, однажды получив вместо иконки кусок моего HTML из скрипта, понял, что что-то не так и больше не обращался. А Chrome настойчив — он дергает этот файл. Это и по логам оказалось так. А файла favicon.ico, конечно, на сайте не было. И тут срабатывало правило — надо его перенаправлять на скрипт, /script.php?param=favicon.ico Внутри логика шла по другому пути, и запись в лог срабатывала, а все отладочные echo выводились только для второго запроса.
Кстати, для прототипа сервиса my.wordrive.com меня порадовала задача написания функции перевода из десятичной в
Вот за это я люблю программирование.