2013-03-29 159 views
0

我正在努力解決Zend Framework 1應用程序的問題。這是一個自定義的網上商店應用程序,從結帳頁面將客戶端重定向到支付網關提供商。所以它看起來像這樣:使用Zend Framework重定向後的新會話ID 1

  1. 當客戶選擇付款方式我們的交易握手被我的申請和支付提供者之間做幕後結帳頁面上。

  2. 支付提供商然後發送給我一個客戶端重定向到的支付url。

  3. 客戶付款和支付提供商將客戶重定向回我們的網上商店成功的網址。

在大多數情況下,這種方式非常好,但在某些情況下,客戶端在重定向到成功頁面後會獲得新的會話ID。這是一個問題,因爲當時正在使用會話數據來完成訂單。

本地我只能在大概50次嘗試中重現這個問題。所以它就是其中一種「有時有效,有時不會出現情況」,換句話說就是在調試和修復時遇到的一個問題。

我試着玩我的application.ini中的會話設置和我的Bootstrap中的_initSession,但事實上在這些更改之後,我設法重現了這個問題(那一次)。

原來的application.ini和bootstrap.php中(僅適用於相關的片)是這樣的:

的application.ini:

resources.session.save_path = APPLICATION_PATH "/../data/sessions" 
    resources.session.gc_maxlifetime = 2592000 
    resources.session.remember_me_seconds = 2592000 

bootstrap.php中:

protected function _initSession() 
    { 
    // set up the session as per the config. 
    $options = $this->getOptions(); 

    $sessionOptions = $options['resources']['session']; 

    Zend_Session::setOptions($sessionOptions); 
    Zend_Session::start(); 
    } 

注意在所有其他情況下/使用情況下,會話在整個站點都能正常工作。只有在重定向之後,它對於某些客戶纔會出錯。我有應用程序記錄額外的信息,我可以看到在這些情況下會話ID的變化。

它可能與長會話的生命週期(1個月)有關嗎?或者我必須調用Zend_Session :: rememberMe(...);在Bootstrap的Zend_Session :: start()之後?或者其他想法,提示和建議?

編輯: 我實驗過其他的會議選項如下:

resources.session.name = myuniquesessionname 
resources.session.use_cookies = on 
resources.session.use_only_cookies = on 
resources.session.save_path = APPLICATION_PATH "/../data/sessions" 
resources.session.gc_maxlifetime = 2592000 
resources.session.remember_me_seconds = 2592000 
resources.session.strict = on 

回答

1

我就此問題打仗,發現我正在處理兩個不同的領域。我的一些用戶開始使用mydomain.com,然後在與支付提供商結束後,他們被重定向回www.mydomain.com。這將導致一個全新的會議。

可能這是您的問題?

如果是的話,我會在引導過程的早期就堅持這樣的事情,可能就在你的index.php文件的頂部:

if($_SERVER['SERVER_NAME'] != 'www.mydomain.com') { 
    Header("Location: http://www.mydomain.com" . $_SERVER['REQUEST_URI']); 
    exit; 
} 

這保證了擺在最前頭的是用戶正在使用的域名你希望他們使用。重定向將使用任何GET變量保留完整的URL。

+0

非常感謝。我只是做了一個快速測試,看起來像是這個問題。支付提供商重定向到不使用www的URL,並且出現此問題的客戶端使用www前綴。你是如何解決這個問題的?我想我可以在htaccess中使用重寫規則,或者是否有Zend_Session的選項使會話只依賴於域而不管前綴是什麼? – Ruben

+0

我不認爲你可以讓會話在兩個域上都能正常工作。在我的情況下,重定向網址是動態的,我可以每次使用我的第三方提供商指定它,並確保重定向網址使用與用戶來自的相同域。另一種選擇是檢查引導文件中的域,並強制(重定向)用戶到您希望他們使用的域。 – jszobody

+0

自己沒有嘗試過,但這可能是[答案](http://stackoverflow.com/questions/1781453/zend-authentication-problem-with-subdomain)。 –

0

對我來說有效的是: 問題的確是會話cookie的域。在我的application.ini中,我添加了:

resources.session.cookie_domain = .mydomainname.com 顯然,mydomainname.com是網店的域名。

現在,在此之後,我在我的開發人員清除我的cookie Firefox的一切工作。我登錄到網站而不使用www。前綴和之後,如果我使用包括www的URL訪問網站。前綴我仍在使用同一個會話。

我清除了服務器端的所有會話。 但是,在我沒有清除Cookie的其他非開發人員瀏覽器中,由於與特定域名關聯的現有cookie,仍然存在會話ID被重新使用的問題。因此,例如在我的Safari瀏覽器中,每當瀏覽兩個不同的URL並且每次使用相同的會話ID時,都會收到兩個會話。爲了解決這個問題,我只是在添加的application.ini會議的名稱:

resources.session.name = NEWSESSID

因此,瀏覽器被強制創建新的名稱,而不是默認PHPSESSID一個新的cookie 。

看起來現在一切都恢復正常。非常感謝您的幫助,非常感謝!