← Назад к статьям

Особенности браузера Chrome

M
miholeus
29 декабря 2011 г. · 1 мин чтения

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;
}

Комментарии 0

Комментарии проходят модерацию
Загрузка комментариев...