天天看點

Wordpress二級域名共享使用者cookie出現錯誤解決方案及WP的Cookie機制

在若幹年以前,我剛開始折騰Wordpress沒多久的時候,就自己摸索過 多個Wordpress網站共享一份資料表的實作方法 。這種看起來好像很高大上的類SSO功能,能夠給使用者在多個網站之間提供快速、無縫、透明的登入體驗。

舉個很簡單的例子,原本有一個Wordpress網站 <code>http://www.example.com(後稱網站A)</code> ,你突然想增加一個部落格子站點 <code>http://blog.example.com(後稱網站B)</code> ,那麼原本在 <code>網站A</code> 注冊的使用者當然不想重新去 <code>網站B</code> 再次注冊。這個時候就展現出本文要探讨的問題的價值了。

廢話不多說,直接開始!

以下例子中所有的域名example.com請自行替換成你的域名

閱讀本文的前提是你已經有基本的網站部署知識,會部署單個Wordpress網站,知道如何給Wordpress配置資料庫資訊,了解Wordpress目錄結構。

如果還沒有部署Wordpress,先按照正常方式下載下傳源檔案、配置環境(這裡不贅述)。 記錄好填入的資料庫名、資料庫使用者名、資料庫密碼等資訊,後續步驟要使用。 (備用資料A)

編輯 <code>wp-config.php</code> ,在任意位置添加如下内容:

同時找到有一排形如 <code>define('XXX_KEY', 'xxxasdas')</code> 的内容(共8行),這裡是設定一些salt,用來給cookie加密。如果沒有也沒有關系,有的話複制這些内容,下面的步驟要使用(備用資料B)。

在網站B的 <code>wp-config.php</code> 檔案中,填寫與網站A一緻的資料庫資訊(備用資料A)

與網站A一樣,在任意位置添加如下内容:

若存在備用資料B(各種define的'XX_KEY'),将這些段落完整的粘貼到網站B的 <code>wp-config.php</code> 中。

将 <code>$table_prefix = 'wp_';</code> 改為 <code>$table_prefix = 'xxx_';</code> ( <code>xxx</code> 是任意不同于 <code>wp</code> 的字元串)

添加如下内容;

我知道,這很惡心,但是我debug了一晚上後,已經實在沒有精力去想一個優雅的解決方案了。請各位Wordpress達人提供一個hook吧……

按理說根據上述配置就可以實作使用者在 <code>www.example.com</code> 登入後打開<code>blog.example.com</code> 也自動處于登入狀态了,但是現實是無情的。即使你發現兩個站點下均存在 <code>wordpress_logged_in_xxxx</code> 的cookie,但是Wordpress就是不能實作這個cookie,調用 <code>is_user_logged_in()</code> 也是傳回false。

經過我各種跟蹤調試,最終定位到核心檔案 <code>wp-includes/default-constants.php</code> 中的一個常量 <code>COOKIEHASH</code> 是罪魁禍首。

源代碼如下:

先提供解決方案,再講原理

将 <code>$siteurl</code> 改成你的頂級域名字元串,即

這下整個世界都清爽了,cookie們終于愉快的在同一個域下同步了!

為什麼一個簡單的常量會導緻cookie同步失敗呢?我們來逐層的恢複這個遞歸。

下面的這些函數并不是定義在同一個檔案中,這裡為了邏輯清晰将它們列在一起。

<a></a>

分析到這裡整個Wordpress的cookie解析流程也清晰了,問題很好定位,就是因為<code>網站A</code> 和 <code>網站B</code> 的 <code>$siteurl</code> 不同,導緻常量定義不同,導緻讀不到cookie,最終導緻了cookie不能跨子域共用。

以上。

本文轉自黃聰部落格園部落格,原文連結:http://www.cnblogs.com/huangcong/p/5512592.html,如需轉載請自行聯系原作者