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

Chrome хороший браузер, однако веб-разработчики могут столкнуться с несколькими проблемами при работе с ним. Вы когда-нибудь замечали, что счетчик в сессии увеличивается не на одно значение, а сразу на несколько при обновлении страницы? У вас было ощущение, что почему-то выполняется не один, а два запроса к странице? Тогда прошу под кат.

Я сталкивался с двумя проблемами этого браузера.

Проблема 1.

Chrome при каждом запросе страницы запрашивает еще и файл иконки favicon.ico. Такое поведение присуще не только chrome, но и еще нескольким браузерам. Если вы раньше пользовались

Mozilla Firefox, то, вероятно, не знали проблем. Этот браузер не делает таких скрытых действий;)

Обычный конфиг реврайта выглядит следующим образом (пример взят для Zend Framework).

[php]
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]
[/php]

Если иконки у вас не обнаружится, то приложение отработает 2 раза.

Решение:

1. Самый простой способ — это положить иконку в корень сайта.

2. Обрабатывать запросы к favicon.ico. Например, можно добавить следующий код для реврайта

[php]
RewriteCond %{REQUEST_FILENAME} ^.*ico$ [NC]
RewriteRule ^.*$ — [NC,L]
[/php]

Проблема 2.

Кроме запроса к favicon.ico Chrome делает еще одну подлянку, он отправляет вместе с GET еще и HEAD запрос. И мы снова наступаем на те же грабли, что и в случае c favicon.ico.

Почему это происходит?

Когда вы вбиваете какое-либо слово в строку поиска, Chrome выполняет dns запрос, чтобы понять является ли искомое слово реальным доменом или нет.

Это своего рода защита от подмены DNS.

Как бороться:

Способ 1.

Экстремальный способ — заблочить этот тип запросов.

Для nginx

[php]
if ($request_method ~ ^HEAD$ ) {
return 405;
}
[/php]

Для Apache

[php]

RewriteEngine on
RewriteCond %{REQUEST_METHOD} =HEAD
RewriteRule .* — [F]

[/php]

Способ 2.

Обрабатывать такие запросы на программном уровне лишь для тех действий, где это критично.

[php]
if($_SERVER[‘REQUEST_METHOD’] == ‘HEAD’) {
return;
}
[/php]

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

:D :) ^_^ :( :o 8) ;-( :lol: xD :wink: :evil: :p :whistle: :woot: :sleep: =] :sick: :straight: :ninja: :love: :kiss: :angel: :bandit: :alien: