今天在sphinx中文網上看到一篇頗有用的文章,轉載過來,分享一下。ps:原文連接http://www.sphinxsearch.org/archives/332php
手機端登陸網站的問題是一個困擾我好久的問題。老是會有那麼一些用戶告訴我,他的手機不能登陸網站了。要想能有效地解決手機登陸的問題,一種方案就 是儘可 能多地模擬出用戶的手機端環境出來,針對這些具體的環境對代碼進行測試和調整。另外一種方案就是儘量地讓網站擺脫對於客戶端cookie環境的依賴,建立 更加健壯的代碼。html
隨着信息技術的發展,手機自己的硬件設備愈來愈先進,功能也愈來愈全面,對於cookie的支持顯然不成問題。不過,總仍是有一部分人羣在使用着比 較低端 的手機。作爲開發者來講,要能最大範圍地知足不一樣手機用戶的需求,就不得不考慮對於不支持cookie的手機的支持。不然,你可能不得不一遍又一遍地對用 戶說,咱們的網站支持帶有cookie功能的手機,甚至還得對着用戶解釋半天什麼是cookie。瀏覽器
那麼,如今就來看看咱們須要爲建立不依賴於cookie的手機端用戶登陸機制須要作哪些準備。服務器
1、瞭解php對於session機制的支持cookie
php.ini中關於session的幾個有用的字段:session
session.use_trans_sid 經過開啓這個參數,便可啓用經過url參數傳遞sessionId的支持。默認值爲0,不開啓。函數
url_rewriter.tags 哪些地方須要用來傳遞sessionId。默認值 爲」a=href,area=href,frame=src,input=src,form=fakeentry」,表示在標籤a=href表示對於標籤 a的href屬性,要將sessionId附加上去。測試
session.use_cookies 默認的值是「1」,表明sessionId使用Cookie來傳遞,反之就是使用url參數來傳遞。若是 session.use_trans_sid=1,那麼啓用該選項,在客戶端支持cookie的狀況下,仍然使用cookie傳遞sessionId,在 檢測到客戶端不支持cookie的狀況下,則會使用url參數傳遞sessionId。網站
session.name 這個就是SessionID儲存的變量名稱,默認爲PHPSESSIDurl
session.cookie_lifetime 這個表明SessionID在客戶端Cookie儲存的時間,默認是0,表明瀏覽器一關閉sessionId就做廢。
session.gc_maxlifetime 這個是Session數據在服務器端儲存的時間,若是超過這個時間,那麼Session數據就自動刪除。
session.save_path session的保存路徑。默認爲/tmp。若是在路徑前加2;則表示cookie的存儲深度爲2。好比若是session.sava_path=2; /tmp/session,那麼sess_005c685e3ec4e0cf6b667245225299c8這個session就會保存在/tmp /session/0/0/這個目錄下。
2、基本使用方法
新建一個session.php文件,代碼爲:
<a href=」hello.php」>hello</a>
最後輸出來的時候連接地址無疑仍是hello.php,那麼,咱們來增長几行代碼,讓它變得能支持傳遞sessionId。
<?php ini_set('session.use_trans_sid',1); ?> <a href=」hello.php」>hello</a>
在瀏覽器中看的時候,連接仍是沒有變化。怎麼回事呢?原來服務器端在檢測到瀏覽器端支持cookie的狀況下,是不會開啓url傳遞sessionId的。
不妨試試禁用瀏覽器的cookie。會發現效果依舊。這是怎麼回事呢?
實際狀況是,要讓服務器支持替換連接地址,首先要讓服務器能獲取到sessionId。那麼咱們就要開啓session才行。這時就要用到session_start函數了。再修改一下代碼以下:
<?php ini_set('session.use_trans_sid',1); session_start(); ?> <a href="/hello.php">hello</a>刷新一下界面,發現生成的源代碼已經變成以下的代碼了。
<a href="/hello.php?PHPSESSID=f10962d83fdfb27b501b53e099916a90">hello</a>
那麼恭喜,咱們的目標已經基本完成了。
在前面的代碼中,咱們都是直接在代碼中使用ini_set函數對php.ini的字段進行設置,這樣作有什麼好處呢?由於在實際的服務器環境中,可 能會運行多個網站,修改php.ini中的配置會直接影響到其餘網站的運行,而是用在代碼中設置則能在最大程度上削弱這種影響。
3、如何確保各類標籤傳遞sessionId
在前面的例子中,咱們已經能讓a標籤的href屬性正確地附加上sessionId了。不過,在實際的開發中,可能會有更加複雜的狀況。好比,你可能會用到form,也有可能用到iframe,甚至即便在使用圖片的時候也須要傳遞sessionId。那麼來看下面的代碼:
<?php ini_set('session.use_trans_sid',1); session_start(); ?> <a href="/hello.php">hello</a> <form> <input value="submit"/> </form> <iframe src="/hello.php"></iframe> <img src="/a.gif"/>
刷新界面後,輸出的代碼爲:
<a href="/hello.php?PHPSESSID=a1ff38e07c28474b80766ef96ad88013">hello</a> <form><input type="hidden" name="PHPSESSID" value="a1ff38e07c28474b80766ef96ad88013" /> <input type="submit" value="submit"/> <iframe src="/hello.php"></iframe> <img src="/a.gif" />
也就是說,對form,已經能很好地傳遞sessionId了,可是對於iframe和img,卻仍是不能傳遞sessionId。怎麼辦呢?難道須要咱們手動來賦值?
其實否則,在第一部分,咱們已經提到一個有用的字段了——url_rewriter.tags。咱們嘗試增長它對於iframe和img的支持。代碼以下:
<?php ini_set('session.use_trans_sid',1); $tags = ini_get('url_rewriter.tags'); ini_set('url_rewriter.tags',$tags.',iframe=src,img=src'); session_start(); ?> <a href="/hello.php">hello</a> <form> <input value="submit"/> </form> <iframe src="/hello.php"></iframe> <img src="/a.gif" />
輸出來的結果以下:
<a href="/hello.php?PHPSESSID=a1ff38e07c28474b80766ef96ad88013">hello</a> <form><input type="hidden" name="PHPSESSID" value="a1ff38e07c28474b80766ef96ad88013" /> <input type="submit" value="submit"/> </form> <iframe src="/hello.php?PHPSESSID=a1ff38e07c28474b80766ef96ad88013"></iframe> <img src="/a.gif?PHPSESSID=a1ff38e07c28474b80766ef96ad88013" />
很顯然,iframe和img也能順利地傳遞sessionId了。
到此爲止,咱們已經能解決大部分的問題了。
4、重定向狀況下的傳遞
經過第二部分,咱們已經能把頁面輸出的sessionId傳遞解決掉了,但這還不是所有。好比,咱們常常會經過設置header來進行頁面的重定向。
header(‘Location: /hello.php’);
在這種狀況下,很顯然,php並不會去處理。那麼,咱們仍是須要本身手動來進行調整了。代碼以下:
<?php ini_set('session.use_trans_sid',1); $tags = ini_get('url_rewriter.tags'); ini_set('url_rewriter.tags',$tags.',iframe=src,img=src'); session_start(); function get_redirect_url($url) { $sessionkey = ini_get('session.name'); $sessionId = session_id(); if (strpos($url,'?') !== false) { $tag = '&'; } else { $tag = '?'; } $url .= $tag.$sessionKey.'='.$sessionId; return $url; } $rurl = get_redirect_url('/hello.php'); header('Location: '.$rurl); ?>
經過get_redirect_url函數,咱們就能將重定向的網址也支持傳遞sessionId了。
太好了,又解決了一種狀況。
5、wap1.x的特殊狀況
不過,在wap1.x下使用wml開發的時候,還有一些特殊的狀況。好比,url中的&須要轉化爲&,不然瀏覽器解釋的時候就會報錯。所以,對於頁面標籤和重定向的狀況,咱們都須要針對wap1.x的頁面作特殊處理。
重定向的狀況很好處理,將第四部分的get_redirect_url函數中的$tag=’&’,在wap1.x的環境中替換 爲$tag=’&’便可。不過對於界面標籤的處理,則須要咱們引入一條新的配置項——arg_separator.output。這個配 置項用來指定當在url中加入sessionId參數時,使用什麼樣的連字符,默認值是&。那麼,在已知處於wap1.x環境時,加入以下的語句 便可逢凶化吉了:
ini_set('arg_separator.output','&');
好了,到此爲止,咱們已經基本上能解決掉wap開發中使用url傳遞sessionId的大部分狀況了。看似內容比較多,實際上就介紹了html標 籤中url如何傳遞sessionId和使用重定向時如何傳遞sessionId兩種狀況,並對wap1.x環境下的狀況作了一些特殊處理,最終確保不依 賴於cookie的用戶登陸機制得以實現的過程。但願這些總結的內容對於wap開發者能帶來必定的幫助。