第一次存取頁面時,PHP 還不知道瀏覽器是否接受 cookie,所以在呼叫 session_start() 之後,SID 將不為空,並且 PHPSESSID 會被插入到該頁面上所有正確使用 SID 的連結 URL 中。
這會導致,例如,如果搜尋引擎機器人首先點擊您的首頁,它在您的首頁上看到的所有連結都將帶有難看的 PHPSESSID=…。
這似乎是預設行為。一種解決方法是啟用 session.use_only_cookies,但這樣就會失去關閉 cookie 的任何人的 session 資料。
有兩種方法可以傳播 session id
Session 模組支援這兩種方法。Cookie 是最佳選擇,但由於並非總是可用,我們也提供了替代方案。第二種方法是將 session id 直接嵌入 URL 中。
PHP 能夠透明地轉換連結。如果啟用執行階段選項 session.use_trans_sid
,相對 URI 將會自動修改為包含 session id。
注意事項:
php.ini 指令中的 arg_separator.output 允許自訂參數分隔符號。為了完全符合 XHTML 標準,請在此指定 &。
或者,您可以使用常數 SID
,如果 session 已經啟動,它就會被定義。如果客戶端沒有發送適當的 session cookie,它的格式會是 session_name=session_id
。否則,它會展開為空字串。因此,您可以無條件地將其嵌入 URL 中。
以下範例示範如何註冊變數,以及如何使用 SID
正確連結到另一個頁面。
範例 #1 計算單一使用者的點擊次數
<?php
session_start();
if (empty($_SESSION['count'])) {
$_SESSION['count'] = 1;
} else {
$_SESSION['count']++;
}
?>
<p>
您好訪客,您已經瀏覽此頁面 <?php echo $_SESSION['count']; ?> 次。
</p>
<p>
要繼續,請 <a href="nextpage.php?<?php echo htmlspecialchars(SID); ?>">點擊
這裡</a>。
</p>
列印 SID
時,可以使用 htmlspecialchars() 函式來防止 XSS 相關攻擊。
如果在編譯 PHP 時使用了 --enable-trans-sid,則不需要像上面顯示的那樣列印 SID
。
注意事項:
第一次存取頁面時,PHP 還不知道瀏覽器是否接受 cookie,所以在呼叫 session_start() 之後,SID 將不為空,並且 PHPSESSID 會被插入到該頁面上所有正確使用 SID 的連結 URL 中。
這會導致,例如,如果搜尋引擎機器人首先點擊您的首頁,它在您的首頁上看到的所有連結都將帶有難看的 PHPSESSID=…。
這似乎是預設行為。一種解決方法是啟用 session.use_only_cookies,但這樣就會失去關閉 cookie 的任何人的 session 資料。
如果 php.ini 檔案中的 session.use_trans_sid 指令設定為 0,則常數 SID 將始終為 ''(空字串)。
但如果指令 `session.use_only_cookies` 設為 1,則設定 `session.use_trans_sid` 為 1 將無效。
試試看
`session_start(['use_only_cookies' => 0])`
或者
`session_start(['use_only_cookies' => 0, 'use_trans_sid' => 1])`