Подтвердить что ты не робот

Случайное проигрывание переменных сеанса только в Google Chrome & URL Rewriting

Используя Google Chrome, я, по-видимому, теряю/искажаю данные сеанса при навигации между страницами (PHP 5.0.4, Apache 2.0.54). Веб-сайт отлично работает в IE7/8, Firefox, Safari и Opera. Проблема заключается только в Google Chrome.

Я сузил проблему. Я использую дружественные поисковые URL и скрываю свой фронт-контроллер (index.php) через файл .htaccess. Таким образом, URL-адрес выглядит следующим образом: www.domain.com/blah/blah/. Содержимое файла .htaccess:

Options +FollowSymlinks 
RewriteEngine on
#allow cool urls 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*) index.php [L] 
#allow to have Url without index.php 

Если я удалю файл .htaccess и выведу фронт-контроллер по URL-адресу: www.domain.com/index.php/blah/blah/, Chrome работает отлично.

Любые мысли идеи? Я думаю, что это какая-то проблема с тем, как Chrome определяет, какой cookie использовать и отправлять на сервер? Это происходит в Chrome 4 и 5. Спасибо!

4b9b3361

Ответ 1

У меня была такая же проблема, и для ее исправления мне нужно было создать favicon.ico и поместить его в webroot - иначе я мог бы видеть, как Fiddler использовал 404 для этого с каждым запросом страницы из Chrome (несмотря на меня фактически не ссылаясь на значок в разметке страницы).

В моем сознании это явно ошибка в Chrome, так как отсутствие favicon не должно влиять на данные сеанса.

Ответ 2

Оказывается, проблема связана с содержимым моего файла .htaccess. Это разрешило проблему:

#<IfModule mod_rewrite.c>

############################################
## enable rewrites

    Options +FollowSymlinks
    RewriteEngine on

############################################
## always send 404 on missing files in these folders

    RewriteCond %{REQUEST_URI} !^/.*(themes|wysiwyg|images|js)/

############################################
## always send 404 on missing favicon

    RewriteRule ^favicon.ico$ favicon.ico [L]

############################################
## never rewrite for existing files, directories and links

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

############################################
## rewrite everything else to index.php

    RewriteRule .* index.php

#</IfModule>

Ответ 3

Попробуйте использовать

 session_set_cookie_params(0, '/', '.domain.com');

для обеспечения соблюдения параметров cookie сеанса. Удалите префиксный период, если вы применяете "нет www" или не используете субдомены.

Вы также можете попробовать позвонить session_write_close() в конце script, чтобы заставить PHP писать и закрывать сеанс тогда и там (это особенно удобно, когда вы запускаете заголовки перенаправления сразу после записи данных сеанса).

UPDATE:

Попробуйте использовать это в .htaccess;

RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Ответ 4

Похоже, эта проблема появилась в браузерах Chrome в последнее время. У меня был сайт, работающий в течение 6 месяцев без каких-либо проблем, и вчера у меня начались проблемы с перезаписыванием данных сеанса. С помощью скрипача я увидел, что хром пытался загрузить значок. Моя проблема заключалась также в том, что у меня была ссылка на "favicon.ico", а не на "/favicon.ico", поэтому chrome добавила favicon.ico к моему querystring, например. /product/abc/favicon.ico, что привело к загрузке страницы дважды, во второй раз переписывая данные сеанса. Итак, мое исправление было:

  • изменить ссылку ref на "/favicon.ico"
  • загружен значок
  • добавил это в .htaccess: RewriteRule ^ favicon.ico $favicon.ico [L]

Последний шаг был упомянут в нескольких ответах, и я бы счел его хорошим ответом, за исключением того, что мне не удалось, потому что ссылка была "favicon.ico".