Rauf Aliev (rauf) wrote,
Rauf Aliev
rauf

О чудесах

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


Продолжение на хабре


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

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

Вот за это я люблю программирование.
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 4 comments