2013-03-29 2 views
0

UPDATE:переменной сеанса не сохраняются на Iphone

Я использую .htaccess для перенаправления пользователей на определенную папку (/ вар/WWW/HTML/тест), который имел все эти файлы, когда они обращались мой веб-сайт. .htaccess, выглядел как этот

<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteRule (?!^test(/.*|)$)^(.*)$ /test/$1 [NC,L] 
</IfModule> 

Когда я переместил все файлы в/вар/WWW/HTML и прокомментировал .htaccess строки .. Сеансы на Iphone начал работать ... Я понятия не имею, почему. Есть ли способ исправить это с помощью .htaccess?

---- Конец обновления -----

У меня есть функция AJAX, которая вызывает функцию входа пользователя и если пользователь/пароль правильны, то входит в систему пользователя. Он работает на рабочем столе, ноутбуке, телефонах samsung s3, но не на IPhone! Кажется, что $this->session->set_userdata('current_email', $email); не устанавливает сеанс на IPHONE, поэтому перенаправляет пользователя на страницу входа. Я предполагаю, возможно, это потому, что cookie-файлы Safari отключены автоматически или что-то в этом роде. Каков наилучший способ обойти это, чтобы он работал на телефоне?

Аякса:

$.ajax({ 
       url: site_url+"/user/login/"+email, 
       type: "post", 
       data: 'password='+password+'&email='+email, 
       success: function(response){  
        if(response == "success"){ 
         window.location.href = site_url+"/user/invites"; 
        }else{ 
         alert("Password is not valid"); 
        } 
       }, 
       error: function(){ 
       } 
      }); 

/пользователь/Войти функция PHP CodeIgniter

public function login($email) 
     { 

       $password = $this->input->post('password'); 

       if($email != NULL){ 

         $this->load->helper('string'); 
         $this->load->model('user_model'); 
         $this->load->library('session'); 

         $user_status = $this->user_model->check_status($email, $password); 

         if (is_array($user_status) && $user_status['is_active']) { 

           $this->session->set_userdata('current_email', $email); 
           $this->session->set_userdata('user_id', $user_status['id']); 
           $this->session->set_userdata('unique_id', $user_status['unique_id']); 
           $this->session->set_userdata('is_active', 1); 

           echo "success"; die(); 
         } 

       } die(); 

     } 

/пользователь/приглашает

public function invites($unique_id = NULL) 
     { 

       if($this->session->userdata('current_email') != FALSE){ 

         $data['unique_id'] = $this->session->userdata('unique_id'); 
         $data['current_email'] = $this->session->userdata('current_email'); 

         if($data['unique_id']){ 

           $data['invited_users'] = $this->user_model->get_invited_users($this->session->userdata('user_id')); 

           $data['user_details'] = $this->user_model->get_user_details($this->session->userdata('user_id')); 

         $this->template->write_view('header', 'templates/header2', $data); 
         $this->template->write_view('content', 'invites', $data); 

         // Render the template 
         $this->template->render(); 

       }else{ 
         redirect('welcome/index/1','refresh'); 
       } 
+0

Это может быть проблема с кэшированием, см. Мой ответ на вопрос о возможном подходе. –

+0

Вы пытались использовать собственные php-сессии '$ _SESSION ['current_email'] = $ email' вместо подхода codeigniters? – Jeemusu

+0

@CodeCrack вы используете ключ шифрования для сеанса? можете ли вы разместить свой ** config.php ** о сеансах PLS? – sbaaaang

ответ

0

Я могу предложить альтернативу: использовать базу данных в качестве обработчика сеанса ,

Вам просто нужно включить его в файл приложения/Config/config.php:

$config['sess_use_database'] = TRUE; 

Вам нужна таблица для хранения сохраненных сессий, руководство предлагает использовать эту схему:

CREATE TABLE IF NOT EXISTS `ci_sessions` (
    session_id varchar(40) DEFAULT '0' NOT NULL, 
    ip_address varchar(45) DEFAULT '0' NOT NULL, 
    user_agent varchar(120) NOT NULL, 
    last_activity int(10) unsigned DEFAULT 0 NOT NULL, 
    user_data text NOT NULL, 
    PRIMARY KEY (session_id), 
    KEY `last_activity_idx` (`last_activity`) 
); 

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

UPDATE:

Поиск по Google привел меня к this CI forum threadthis SO answer). Причиной может быть кэширование сафари запроса AJAX, поэтому вам нужно добавить временную метку к URL-адресу, и проблема должна быть решена. Пример:

var timestamp = new Date().getTime();  
$.ajax({ 
    url: site_url+"/user/login/"+email+"?"+timestamp, // Or use '/' instead of '?' 
+0

Они настроены. Просто не на iPhone! Я пытаюсь найти способ обойти его без сеансов db. – CodeCrack

+0

См. Обновленный ответ –

+0

Я пробовал это раньше, но это не сработало. Я также видел это решение раньше, но я не уверен, что это относится к моему делу. – CodeCrack

0

Является ли вызов ajax отправленным во внешний домен?

Если да, то это могло бы иметь что-то делать с вопросами безопасности. См .: http://drupal.org/node/918194

Я только справился с этой проблемой в IE, я не знаю, может ли это случиться в iOS.

Так попробуйте добавить следующее на AJAX принимающей скрипт:

<?php 
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'); 
?> 

Примечания: убедитесь, что этот заголовок помещается на все необходимые страницах и это происходит в самом начале вашего скрипта.

Смежные вопросы