Почему, если я создаю файл cookie на www.example.com и проверяю его на example.com, cookie там не существует? Я планирую просто использовать .htaccess
перенаправить не-www в домен www. Но как я могу это решить?
Браузеры являются главным виновником здесь, а не PHP. Они хранят по домену и не знают, что www
– особый случай; с их точки зрения, www.mydomain.com
и mydomain.com
являются разными строками и, следовательно, имеют разные политики безопасности. Однако есть что-то, что вы можете сделать.
При настройке файла cookie используйте .mydomain.com
(с ведущей точкой). Это позволит браузеру вашего пользователя сделать cookie доступным для mydomain.com
и всех поддоменов, включая www
. У setcookie PHP есть аргумент $domain
, но он пятый в списке, поэтому вам может потребоваться установить $expire
и $path
для значений по умолчанию, чтобы получить его.
setcookie('name', 'value', time()+3600, '/', '.mydomain.com');
Однако для согласованности вы можете рассмотреть возможность перенаправления всего веб-трафика на определенный домен, то есть отправить трафик mydomain.com
на www.mydomain.com
или наоборот. Мое смутное знание SEO (отредактируйте, если оно неверно) говорит мне, что оно полезно, чтобы не дублировать контент, и это избавляет вас от всех таких проблем с проверкой подлинности. Кроме того, если вы храните активы в субдомене, то наличие куки-файлов там замедляет трафик за счет его транспортировки каждый раз, поэтому сохранение файлов cookie приложений только на www
дает вам ускорение скорости.
Вот учебник о том, как выполнить такую перенаправление в Apache.
setcookie("CookieName", "value", time()+3600, "/", ".mydomain.com");
Я считаю, что вы можете установить файл cookie на example.com (на самом деле .example.com), и он будет отправлен, если они отправятся на сайт http://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 .
потому что php переводит http://www.mydomain.com иначе, чем mydomain.com. Если домены не на 100% идентичны, cookie не будет совпадать.
И я уверен, что браузер также ищет 100% -ное совпадение имени домена, прежде чем разрешить серверам перезаписывать их.
Просто используйте .htaccess для перенаправления. Это единственный способ справиться с этим во всех браузерах.