Случайное проигрывание переменных сеанса только в 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. Спасибо!
4 Solutions collect form web for “Случайное проигрывание переменных сеанса только в Google Chrome & URL Rewriting”
У меня была такая же проблема, и для ее исправления мне нужно было только создать favicon.ico и поместить его в webroot – иначе я мог бы видеть, как Fiddler использовал 404 для этого с каждым запросом страницы из Chrome (несмотря на то, что я на самом деле не связывал к значку в разметке страницы).
На мой взгляд, это явно ошибка в Chrome, так как отсутствие favicon не должно влиять на данные сеанса.
Оказывается, проблема связана с содержимым моего файла .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>
Попробуйте использовать;
session_set_cookie_params(0, '/', '.domain.com');
для обеспечения соблюдения параметров cookie сеанса. Удалите префиксный период, если вы применяете «нет www» или не используете субдомены.
Вы также можете попробовать вызвать session_write_close()
в конце скрипта, чтобы заставить PHP писать и закрывать сеанс тогда и там (это особенно удобно, когда вы запускаете заголовки перенаправления сразу после записи данных сеанса).
ОБНОВИТЬ:
Попробуйте использовать это в своем .htaccess
;
RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]
Похоже, эта проблема появилась в браузерах 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».