跨 Apache vhost 萬用字元域處理 PHP 會話的最佳方式
我目前正在執行一個允許使用者使用自定義域的站點(即,他們可以擁有 myaccount.com,而不是 mysite.com/myaccount)。他們只需更改其域的 A 記錄,然後我們在 Apache 上使用萬用字元 vhost 來擷取來自自定義域的請求。設置基本上如下所示。第一個 vhost 擷取 mysite.com/myaccount 請求,第二個將用於 myaccount.com。如您所見,它們具有完全相同的路徑和 php cookie_domain。
我注意到下面的行周圍有一些奇怪的行為
"#The line below me"
。啟動時,自定義域在每次頁面載入時都會獲得一個新的 session_id(這與非自定義域會話不同)。但是,當我註釋掉該行時,使用者在每次頁面載入時都保持相同的 session_id,但該 session_id 與他們在非自定義域站點上看到的不同,儘管它們完全位於同一台伺服器上。有一種“hack”解決方法,包括將使用者重定向到 mysite.com/myaccount、獲取會話 ID、重定向回 myaccount.com,然後在 myaccount.com 上使用該 ID。但這可能會有點混亂(即,如果使用者從 mysite.com/myaccount 註銷,myaccount.com 怎麼知道?)。
對於它的價值,我正在使用數據庫來管理會話(即,在不同的伺服器上等沒有問題,但這無關緊要,因為我們目前只使用一台伺服器來處理所有請求)。
我相當肯定它與某種 CSRF 瀏覽器保護有關,但它不應該足夠聰明地知道它在同一台伺服器上嗎?
注意:這些是子域,它們完全是獨立的域(但在同一台伺服器上)。
<VirtualHost *:80> DocumentRoot "/opt/local/www/mysite.com" ServerName mysite.local ErrorLog "/opt/local/apache2/logs/mysite.com-error.log" CustomLog "/opt/local/apache2/logs/mysite.com-access.log" common <Directory "/opt/local/www/mysite.com"> AllowOverride All #php_value session.save_path "/opt/local/www/mysite.com/sessions" php_value session.cookie_domain "mysite.local" php_value auto_prepend_file "/opt/local/www/mysite.com/core.php" </Directory> </VirtualHost> #Wildcard (custom domain) vhost <VirtualHost *:80> DocumentRoot "/opt/local/www/mysite.com" ServerName default ServerAlias * ErrorLog "/opt/local/apache2/logs/mysite.com-error.log" CustomLog "/opt/local/apache2/logs/mysite.com-access.log" common <Directory "/opt/local/www/mysite.com"> AllowOverride All #php_value session.save_path "/opt/local/www/mysite.com/sessions" # The line below me php_value session.cookie_domain "mysite.local" php_value auto_prepend_file "/opt/local/www/mysite.com/core.php" </Directory> </VirtualHost>
當然,您可以通過在域之間傳遞 SID 很容易地做到這一點?
關鍵是會話傳輸——如何執行它取決於您。
通過使用 SID 的 GET,或者在應用程序級別。您有一個帶有組合散列標識符(IP + UserAgent + OS 等)和相應 SID 的數據庫表。然後您可以“檢測”使用者 - 匹配標識符並設置適當的會話。
但是,如果它沒有正確執行,您可能會以會話劫持或徹底的會話失去而告終。
或者,一個更好的方法可能是使用第 3 方站點/服務進行身份驗證(OpenID/Google/Facebook/Twitter 等)。然後您可以使用它來計算相應的伺服器端會話。