Случайные потери переменных сеанса только в Google Chrome и перезаписи URL - PullRequest
18 голосов
/ 02 июня 2010

Используя 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 и выставляю фронт-контроллер по адресу: www.domain.com/index.php/blah/blah/, Chrome работает отлично.

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

Ответы [ 4 ]

17 голосов
/ 24 января 2011

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

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

8 голосов
/ 02 июня 2010

Оказывается, проблема была с содержимым моего файла .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>
0 голосов
/ 29 июля 2015

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

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

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

0 голосов
/ 02 июня 2010

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

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

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

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

UPDATE:

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

RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...