Chrome хороший браузер, однако веб-разработчики могут столкнуться с несколькими проблемами при работе с ним. Вы когда-нибудь замечали, что счетчик в сессии увеличивается не на одно значение, а сразу на несколько при обновлении страницы? У вас было ощущение, что почему-то выполняется не один, а два запроса к странице? Тогда прошу под кат.
Я сталкивался с двумя проблемами этого браузера.
Проблема 1.
Chrome при каждом запросе страницы запрашивает еще и файл иконки favicon.ico. Такое поведение присуще не только chrome, но и еще нескольким браузерам. Если вы раньше пользовались
Mozilla Firefox, то, вероятно, не знали проблем. Этот браузер не делает таких скрытых действий;)
Обычный конфиг реврайта выглядит следующим образом (пример взят для Zend Framework).
SetEnv APPLICATION_ENV production
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.$ - [NC,L] RewriteRule ^.$ index.php [NC,L]
Если иконки у вас не обнаружится, то приложение отработает 2 раза.
Решение:
1. Самый простой способ – это положить иконку в корень сайта.
2. Обрабатывать запросы к favicon.ico. Например, можно добавить следующий код для реврайта
RewriteCond %{REQUEST_FILENAME} ^.ico$ [NC] RewriteRule ^.$ - [NC,L]
Проблема 2.
Кроме запроса к favicon.ico Chrome делает еще одну подлянку, он отправляет вместе с GET еще и HEAD запрос. И мы снова наступаем на те же грабли, что и в случае c favicon.ico.
Почему это происходит?
Когда вы вбиваете какое-либо слово в строку поиска, Chrome выполняет dns запрос, чтобы понять является ли искомое слово реальным доменом или нет.
Это своего рода защита от подмены DNS.
Как бороться:
Способ 1.
Экстремальный способ – заблочить этот тип запросов.
Для nginx
if ($request_method ~ ^HEAD$ ) {
return 405;
}
Для Apache
RewriteEngine on
RewriteCond %{REQUEST_METHOD} =HEAD
RewriteRule .* - [F]
Способ 2.
Обрабатывать такие запросы на программном уровне лишь для тех действий, где это критично.
if($_SERVER['REQUEST_METHOD'] == 'HEAD') {
return;
}
Leave a Reply