Pull to refresh

О чудесах

Reading time 5 min
Views 1.7K
Время от времени каждый из нас может вспомнить ситуации, когда ну вот всё правильно делаешь, а система «чудит». Бьешься, пытаешься найти проблему, уже и консиллиум вокруг себя собрал — никто не может понять, в чем дело, а потом проходит какое время и наступает озарение. И понимаешь, что сглупил, что вот она, ошибка. На поверхности лежала. Потом такие байки можно в профессиональной тусовке рассказывать.


Маленький оффтопик с программерской тематики на жизненную. Лет семь назад со мной в Турции, в отеле, произошла забавная ситуация. Мне понадобилось зачем-то погладить там футболку и я пытался сформулировать глубокую мысль на английском, ну как мог. На ресепшене его тоже знали не очень, они пытались меня понять.

— Ту а’йрон, ай ниид ту айрон, — говорю я девушке. 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 уровня сервера и там тоже есть правила. Наверное, обрабатываются два раза. И написал им заявку.

Вместе с хостингом мы убедились, что:

  1. если стереть .htaccess или убрать оттуда RewriteEngine, — все работает,
  2. если воспользоваться Firefox — все работает,
  3. один хром у хостера тоже не выдал проблемы.

Ребята из хостинга возились три часа. В итоге прислали письмо:

Здравствуйте, Рауф.

Проблема, связанная с повторным исполнением скрипта, вызвана исключительно самим
браузером "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 меня порадовала задача написания функции перевода из десятичной в 62-ричную систему и обратно. Ведь появляются же такие задачи!.. И ведь без нее никак.

Вот за это я люблю программирование.
Tags:
Hubs:
+60
Comments 97
Comments Comments 97

Articles