2010-02-26 4 views
13

Почему это так, что если я создаю файл cookie на www.example.com и проведу его на example.com, cookie там не существует? Я планирую просто использовать .htaccess перенаправить не-www в домен www. Но как я могу это решить?Проблема с файлом cookie PHP - www или без www

+0

Вы должны установить домен cookie явно. Или используйте что-то вроде https://github.com/delight-im/PHP-Cookie, который автоматически обрабатывает случай «www» и «не-www». – caw

ответ

32

Браузеры являются главным виновником здесь, а не PHP. Они хранят по домену и не знают, что www - особый случай; с их точки зрения, www.mydomain.com и mydomain.com - это разные строки и поэтому имеют разные политики безопасности. Однако есть что-то, что вы можете сделать.

При настройке файла cookie используйте .mydomain.com (с ведущей точкой). Это скажет браузеру вашего пользователя, чтобы файл cookie был доступен для mydomain.com и всех поддоменов, включая www. PHP setcookie имеет аргумент $domain, но он пятый в списке, поэтому вам может понадобиться установить $expire и $path на их значения по умолчанию, чтобы попасть на него.

setcookie('name', 'value', time()+3600, '/', '.mydomain.com'); 

Для согласованности, однако, вы можете рассмотреть переразводки весь веб-трафик на определенный домен, то есть отправить mydomain.com трафик www.mydomain.com, или наоборот. Мое смутное знание SEO (отредактируйте, если оно неверно) говорит мне, что оно полезно, чтобы не дублировать контент, и это избавляет вас от всех таких проблем с проверкой подлинности. Кроме того, если вы храните активы на субдомене, то наличие куки-файлов там замедляет трафик за счет его транспортировки каждый раз, поэтому сохранение файлов cookie приложений только на www дает вам ускорение скорости.

Here is a tutorial on how to accomplish such a redirect in Apache.

+0

Вы близки к материалам SEO. Неважно, если вы решите сделать это с или без www; до тех пор, пока вы выбираете один и придерживаетесь его. – NotMe

+0

Отредактировано для обобщения: – Matchu

+0

www. * Не является особым случаем. Это соглашение, но оно не имеет кодифицированного значения в RFC-файлах http/cookie.Было бы абсурдно, если бы браузеры волшебным образом предоставляли специальное лечение. Независимо от того, +1. –

-2

потому что php переводит www.mydomain.com иначе, чем mydomain.com. Если домены не на 100% идентичны, cookie не будет совпадать.

И я уверен, что браузер также ищет 100% -ное совпадение имени домена, прежде чем разрешить серверам перезаписывать их.

Просто используйте .htaccess для перенаправления. Это единственный способ справиться с этим во всех браузерах.

+0

Префикс домена с периодом устраняет проблему. Точное совпадение не требуется. – TheJacobTaylor

+1

"потому что php переводит" ... Это не имеет ничего общего с php и все, что связано с браузерами. Браузеры не отправляют каждый файл cookie, который у них есть на веб-сайт. Они выбирают только те, которые имеют соответствующие имена доменов. – NotMe

0

Я считаю, что вы можете установить куки на example.com (действительно .example.com), и он будет отправлен, если они идут на www.example.com, но не наоборот. Эта стандартная политика безопасности заключается в предотвращении отправки личных данных пользователей на непреднамеренные серверы.

Лично я использую VirtualHosts в моем apache2.conf:

<VirtualHost *:80> 
    ServerName example.com 
    RedirectMatch (.*) http://www.example.com$1 
</VirtualHost> 

... в этом примере, каждый пытается загрузить, например, http://example.com/index.html перенаправлен на http://www.example.com/index.html.

1
setcookie("CookieName", "value", time()+3600, "/", ".mydomain.com"); 
Смежные вопросы