Случайное проигрывание переменных сеанса только в 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. Спасибо!
Ответы
Ответ 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".