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

Leave a Reply

Your email address will not be published. Required fields are marked *