Apache-2.2

跨 Apache vhost 萬用字元域處理 PHP 會話的最佳方式

  • June 27, 2012

我目前正在執行一個允許使用者使用自定義域的站點(即,他們可以擁有 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 等)。然後您可以使用它來計算相應的伺服器端會話。

引用自:https://serverfault.com/questions/402724