Багфикс — Кукис , для домена с www и без .

Наверное некоторые заметили , что при входе на сайт — www.site.ru и потом при переходе на site.ru надо было логиниться снова .
То есть система выставляла куки , для одного домена , через который вы логинитесь . Ваще не круто и пользователям приходилось объяснять что и как , бла бла бла …

Фиксим эту хрень следующим способом . Находим в файле include/functions.php функцию —

function logincookie($id, $passhash, $updatedb = 1, $expires = 0x7fffffff) {
 
	$subnet = explode('.', getip());
	$subnet[2] = $subnet[3] = 0;
	$subnet = implode('.', $subnet); // 255.255.0.0
 
	setcookie(COOKIE_UID, $id, $expires, '/');
	setcookie(COOKIE_PASSHASH, md5($passhash.COOKIE_SALT.$subnet), $expires, '/');
 
	if ($updatedb)
		sql_query('UPDATE users SET last_login = NOW() WHERE id = '.$id);
}

и функцию

function logoutcookie() {
//	setcookie(COOKIE_UID, '', 0x7fffffff, '/'); // Не стоит убирать комментирование т.к небудет работать система анти-двойной реги
	setcookie(COOKIE_PASSHASH, '', 0x7fffffff, '/');
}
?

заменяем их на —

function logincookie($id, $passhash, $updatedb = 1, $expires = 0x7fffffff) {
 
		$domain = $_SERVER['HTTP_HOST'];
		if ( strtolower( substr($domain, 0, 4) ) == 'www.' )
			$domain = substr($domain, 4);	// Fix the domain to accept domains with and without 'www.'. 
		if ( substr($domain, 0, 1) != '.' )
			$domain = '.'.$domain;	// Add the dot prefix to ensure compatibility with subdomains
 
	$subnet = explode('.', getip());
	$subnet[2] = $subnet[3] = 0;
	$subnet = implode('.', $subnet); // 255.255.0.0
 
	setcookie(COOKIE_UID, $id, $expires, '/',$domain);
	setcookie(COOKIE_PASSHASH, md5($passhash.COOKIE_SALT.$subnet), $expires, '/',$domain);
 
	if ($updatedb)
		sql_query('UPDATE users SET last_login = NOW() WHERE id = '.$id);
}

и функцию

function logoutcookie() {
 
		$domain = $_SERVER['HTTP_HOST'];
		if ( strtolower( substr($domain, 0, 4) ) == 'www.' )
			$domain = substr($domain, 4);	// Fix the domain to accept domains with and without 'www.'. 
		if ( substr($domain, 0, 1) != '.' )
			$domain = '.'.$domain;	// Add the dot prefix to ensure compatibility with subdomains
 
 
//	setcookie(COOKIE_UID, '', 0x7fffffff, '/',$domain); // Не стоит убирать комментирование т.к небудет работать система анти-двойной реги
	setcookie(COOKIE_PASSHASH, '', 0x7fffffff, '/',$domain);
}
?

Что добавилось —

		$domain = $_SERVER['HTTP_HOST'];
		if ( strtolower( substr($domain, 0, 4) ) == 'www.' )
			$domain = substr($domain, 4);	// Fix the domain to accept domains with and without 'www.'. 
		if ( substr($domain, 0, 1) != '.' )
			$domain = '.'.$domain;	// Add the dot prefix to ensure compatibility with subdomains

Функция , которая определяет домен с которого производиться попытка входа в систему , далее она обрезает www и выставляет домен в виде — .site.ru ! Имена с такой формой домена , кукис будут работать для доменов www.site.ru и site.ru .
Далее , полученный домен .site.ru присваиваем к кукам — $domain .

Могут быть проблемы с выходом с сайта для тех пользователей кто уже зологинлся по старой функции , так что просто попросите их удалить куки .

Багфикс — Кукис , для домена с www и без .: 14 комментариев

  1. webnet Автор записи

    Это уже совсем два разных сайта получается .
    Тут речь идет о домене с www и без .

  2. JustME

    У меня трекер один, просто первый адрес для внешки, а второй для локалки

  3. Morgan

    Невозможно залогиниться и выйти с сайта после этого фикса в Мозилле
    В Опере работает отлично

  4. webnet Автор записи

    Могут быть проблемы с выходом с сайта для тех пользователей кто уже зологинлся по старой функции , так что просто попросите их удалить куки .

  5. eEye

    Спасибо! удобный фикс, пользователи всё равно умудряются находить ссылку с www и использовать её.

  6. kingarm

    У меня что то не пашет 🙁

    Не поможешь вебнет?

    Вот код мой:
    function logincookie($id, $passhash, $language, $updatedb = 1, $expires = 0x7fffffff) {
    setcookie(«uid», $id, $expires, «/»);
    setcookie(«pass», cookieFromPasshash($passhash), $expires, «/»);
    setcookie(«lang», $language, $expires, «/»);

    if ($updatedb)
    sql_query(«UPDATE users SET last_login = NOW() WHERE id = $id»);
    }

    function logoutcookie() {
    setcookie(«uid», «», 0x7fffffff, «/»);
    setcookie(«pass», «», 0x7fffffff, «/»);
    setcookie(«lang», «», 0x7fffffff, «/»);
    }

  7. kingarm

    Может кто поможет? Извините за назойливость просто второй день уже чёт ни слуху не духу 🙂

  8. parey

    странно только щас на эту статью наткнулся. Давненько я тоже заметил эту проблему, но данной статьи не видел. Проблему посоветовали решить 301 редиректом. Т.е. в .htaccess

    прописать

    Options +FollowSymLinks
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www.vash_sait\.ru$ [NC]
    RewriteRule ^(.*)$ http://vash_sait.ru/$1 [R=301,L]

    Это наверно тоже можно сказать своего рода фикс или типа того.

Комментарии запрещены.