ЧПУ с помощью 404 ошибки и сессии...

fog

Рыцарь Джедай
ЧПУ с помощью 404 ошибки и сессии...

когда человек переходит по УРЛ, например my.com/news/120/ - Он попадает на index.php c переменной $REQUEST_URI /news/120/, там урл разбирается и польхователь получает то, что хотел. но если я использую сессии, и куки отключены, то $REQUEST_URI содержит что-то типа
/news/120/?PHPSESSID=59f4740d57b8c5a790c86d3dcf5df41b
и переменная PHPSESSID в index.php не существует. Первое что приходит на ум - отрезать 32 байта после PHPSESSID=, и писать их в переменную PHPSESSID, но, может есть какой-нибудь нюанс, более правильный способ?
 

fog

Рыцарь Джедай
Я же говорю, не будет там session_id работать, я же не вызываю страничку с параметром ?PHPSESSID а вызываю файл которого не существует на самом деле... и передаётся номер сессии только через REQUEST_URI


Хм, почему-то не работает способ с вырезанием из $REQUEST_URI номера сессии. Вернее работает, но не так как нужно. Сессия регистрируется, переменные сохраняются, в УРЛ подставляется номер сессии. внешне - всё в порядке. Но на самом деле, почему-то каждый раз создаётся новый файл сессии. Что я делаю не так?

Вот пример вырезания номера сессии:
PHP:
if (!isset($PHPSESSID) and (strpos($REQUEST_URI, "PHPSESSID=")!=false))
	{
	$id = strpos($REQUEST_URI, "PHPSESSID=");
	$id = substr($REQUEST_URI, $id+10, 32);
	if (strlen($id)==32)
	session_id($id);
	$PHPSESSID = $id;
	}
 

ForJest

- свежая кровь
Кликни по ссылке и почитай. Если не поможет - я могу тебе скопировать прямо сюда.
 

fog

Рыцарь Джедай
И что я должен там увидеть?
То что session_id() возвращает id сессии?
 

ForJest

- свежая кровь
Окей. Чудесно.
Теперь прочитай остальные строчки и первый пример :).
 

fog

Рыцарь Джедай
Автор оригинала: ForJest
Окей. Чудесно.
Теперь прочитай остальные строчки и первый пример :).
=))))))))))))))))


Но до сих пор понять не могу что ты хочешь мне сказать. Пожалей глупого, скажи нормальным языком.

Что там такого в этом примере?
Ну чел подсовывает свой ID сессии, я в куске кода во втором посте тоже самое сделал... и что? :)
 

ForJest

- свежая кровь
Окей. Хинт :)
session_start в ссылке [m]session_id[/m] и твоей собственной программе. Последовательность вызова.
 

fog

Рыцарь Джедай
Автор оригинала: ForJest
Окей. Хинт :)
session_start в ссылке [m]session_id[/m] и твоей собственной программе. Последовательность вызова.
Ну конечно же session_id($id); вызывается ДО session_start, вот кусок кода пошире...


PHP:
$err = $my->sql_connect();
if ($err) 
	{
	$my->err_to_html($err);
	die("Ошибка: Невозможно установить соединение с базой данных.");
	}

if (!isset($PHPSESSID) and (strpos($REQUEST_URI, "PHPSESSID=")!=false))
	{
	$id = strpos($REQUEST_URI, "PHPSESSID=");
	$id = substr($REQUEST_URI, $id+10, 32);
	if (strlen($id)==32)
	session_id($id);
	$PHPSESSID = $id;
	}

//$my->prr($GLOBALS);

unset($vars);
session_start();
session_register("vars");

header("http/1.0 200 Ok"); 
$loc = explode("/",$REQUEST_URI);
 

ForJest

- свежая кровь
У меня твой пример работает. Правда не через 404 ошибку, а как обычный скрипт.
Сессия регистрируется, переменные сохраняются, в УРЛ подставляется номер сессии. внешне - всё в порядке. Но на самом деле, почему-то каждый раз создаётся новый файл сессии.
Новый файл сессии создаваться не может. Потому что одному PHPSESSID соответствует один файл.
Если скрипт получил ID, то он выставит куку и произведет замену всех URL и форм на выдаваемой странице, значит в следующий раз юзер получит опять то же самый идентификатор.
Может конечно это и не имеет значения но по идее должно быть
PHP:
if (strlen($id)==32) 
{
    session_id($id); 
    $PHPSESSID = $id; 
}
:)
 

fog

Рыцарь Джедай
У меня твой пример работает. Правда не через 404 ошибку, а как обычный скрипт.
Ну конечно оно будет работать!
глобальная переменная же создаётся. а если .htaccess тебя пересылает на /index.php - переменная теряется. и id сохраняется только в REQUEST_URI...

if (strlen($id)==32)
{
session_id($id);
$PHPSESSID = $id;
}
не, не имеет, всё равно проверка на 32 символа "на всякий пожарный"

блин.
 

ForJest

- свежая кровь
и id сохраняется только в REQUEST_URI...
Ну и в чем проблема, тогда непонятно? Получил PHPSESSID, установил его как идентификатор сессии, стартанул сессию - все - сессии должны работать чудесно. Если конечно у тебя не вызывается в includ'ах session_start чуть раньше. Тогда будет стартовать новая сессия и появляться новые файлы.
Ты можешь описать, что конкретно происходит? По твоему описанию все попадает под то, что ты вызываешь session_start раньше, чем установишь id.
 

fog

Рыцарь Джедай
Решил я вчера таки проблему.
Суть была совсем не в том что мы обсуждали, у меня всё было изначально правильно.

Даже незнаю почему оно так работало.
По порядку:

Когда я пишу сайт, я разделяю вёрстку на две части, inc_top inc_bottom и потом игклудаю где нужно.

так вот.
новые сессии создавались, когда в inc_bottom вызывались ссылки на изображения типа <img src='images/1x1.gif'> после того как я добавил слеши перед вызовом картинки - всё заработало нормально
<img src='/images/1x1.gif'>

Вот так :)

Природу этого явления я не очень понимаю.
 
Сверху