1. 程式人生 > >同一網站不同和二級域名和不同子目錄的cookie 作用範圍問題

同一網站不同和二級域名和不同子目錄的cookie 作用範圍問題

轉載連結 http://www.cnblogs.com/mitang/p/3884774.html

1、cookie二級域名的實現:

使用者其中一個站點登入,而且可以各個子頻道間切換,保持登入狀態設定Cookie時,使用如下程式碼即可:
setcookie(name,value,expire,path,"domain.com");
這樣,在每個二級域名都能讀取這個Cookie的值。 參見:

cookie共享於二級域名

一個cookie如上4個重要的屬性:

1)maxAge:cookie被客戶端保持的時間,單位為(秒),正數表示在指定的秒數後過期被客戶端刪除,0表示刪除此cookie(置空),負數則表示此cookie不會被客戶端儲存,將在瀏覽器關閉後清除.

2)domain:cookie可被有效操作的域,可以為ip/hostname等,不過需要宣告:*.abc.com,.abc.com,abc.com這三種方式會有區別,客戶端會做簡單的匹配.多數情況下直接使用abc.com可以接受多級子域名.只有正確匹配domain的cookie才會被髮送給server.

3)secure:是否只允許安全加密url訪問,預設為false,如果為true,那麼cookie只對https/SSL等加密連線才會傳送給server.

4)path:cookie對domain何路徑下訪問有效,"/"表示domain下根目錄中所有請求有效,"/open"表示只對domain/open目錄下請求有效,如果此path忘記設定,你將遇到一個很尷尬的問題:明明在其他頁面設定了cookie輸出,但是換個頁面卻死活不行..

path

The path on the server in which the cookie will be available on. If set to '/', the cookie will be available within the entire domain. If set to '/foo/', the cookie will only be available within the /foo/ directory and all sub-directories such as /foo/bar/ of domain. The default value is the current directory that the cookie is being set in.

domain和path是決定可跨域的2個引數.

對於domain,"abc.com"則可以在abc.com主域名之下的多級子域名有效,".abc.com"只能在二級域名以及"www.abc.com"下有效,其實客戶端只是做了簡單的匹配..你可以在此基礎上做更多的分級控制..

path是個有參考意義的屬性,對於部分路徑下開放訪問的系統有意義,比如:abc.com/open下的程式和登入是開放給特殊開發者接入的,這裡的資料活著cookie需要做一些另類的處理..

2、同一網站不同子目錄的cookie要設定path,才能互相訪問。參見: 

cookie path

以前使用cookie的時候 沒有在意path的問題。這次公司商城實現了靜態化的功能,多了2級目錄。導致了我在商品詳情頁面設定好的cookie(path為/good/商品ID/)在店鋪首頁竟然訪問不到(店鋪首頁的path為'/store/')。cookie的名稱都是一致的。唯一不同的只有path。在商品詳情頁設定cookie的時候吧path設定成‘/’,這樣修改之後就可以正常的在店鋪首頁取到設定好的cookie了。

使用關鍵字 javascript cookie  path 還搜尋到了,原來10年來IE一直存在一個cookie path的一個bug(原文地址:http://conkeyn.iteye.com/blog/423549)。

手上一個廣告專案,在Firefox下順利測試通過。自信JS程式碼能相容IE,FF測試過後隨手就仍給CS測試,結果CS反饋說有問題。排查一番, 發現居然和Javascript 設定 Cookie 時的 path 有關。IE下Cookie種在 /或者URL所在路徑時正常,如果Cookie值作用域在當前URL下則IE下javascript 無法獲取到設定的Cookie值。

看下面演示程式碼:

  1. var cookie_name = "name";  
  2. var cookie_value = "value";  
  3. expires = new Date();  
  4. expires.setTime(expires.getTime() + 86400 * 1000);  
  5. // 有Bug document.cookie無法獨到cookie_name值  
  6. document.cookie = cookie_name + "=" + encodeURIComponent(cookie_value)  
  7.         + "; expires=" + expires.toGMTString() + "; path="  
  8.         + window.location.pathname;  
  9. // 正常  
  10. document.cookie = cookie_name + "=" + encodeURIComponent(cookie_value)  
  11.         + "; expires=" + expires.toGMTString() + "; path=/test/";  
  12. // 正常  
  13. document.cookie = "cookie_name=" + encodeURIComponent(cookie_value)  
  14.         + "; expires=" + expires.toGMTString() + "; path=/";  

懷疑是IE的Bug、
在google上 搜了下關鍵詞: ie javascript cookie path bug 
同樣的問題在罪與罰 的部落格上也有描述,而且博主聯絡過微軟IEBLOG 的Eric。得到的回覆是:

You have uncovered an IE bug where cookies that are set with a path that contains a filename (e.g. /page.htm) are not accessible to the document.cookie function, although they are correctly sent to the server in the HTTP header. This has been broken for at least 10 years and unfortunately probably will not be fixed in IE8.

Thanks,

-Eric

一個存在10年的Bug。。。而且IE8也不會修復,實在是無語。

需求是cookie值只對當前頁面有效,沒辦法只好用替代方案,看程式碼:

  1. //IE Cookie Bug 替代方案  
  2. var cookie_path = window.location.pathname;  
  3. var cookie_name = encodeURIComponent(cookie_path.substring(cookie_path  
  4.         .lastIndexOf('/') + 1));  
  5. cookie_path = cookie_path.substring(0, cookie_path.lastIndexOf('/') + 1);  
  6. var cookie_value = "value";  
  7. expires = new Date();  
  8. expires.setTime(expires.getTime() + 86400 * 1000);  
  9. document.cookie = cookie_name + "=" + encodeURIComponent(cookie_value)  
  10.         + "; expires=" + expires.toGMTString() + "; path=" + cookie_path;  

 替代方案根據每個頁面的URL檔名來做Cookie名,有效範圍在當前頁路經下。
如:url 等於 /test/test.html
則cookie名為test.html,有效路徑為/test/
這樣也可以做到同一個js部署在每個頁面上能讀到只對當前URL有效的cookie值。代價是當用戶在同一級目錄下訪問很多頁面時會導致cookie值不 斷增大。結果是當前路徑下的每個http請求都帶很長一段的cookie,直接導致伺服器接收客戶端request的header長度增長,流量增長的同 時伺服器負擔也變重。而且根據 RFC 2109 的定義Cookie也有長度和個數限制,IE允許的最大 Cookie 長度是 4096 位元組,允許50個 Cookie 名-值對。如果要突破50個名-值對的限制,可以在一個名-值使用Cookie字典的方式儲存更多的Cookie變數。

這次的靜態化功能讓我學到了cookie的這個問題。很是高興啊。

這次靜態化功能還涉及到了一個跨域請求的問題。事情是這樣的:

我在搜尋模組(域名search.emall.xxx.xxx)需要顯示當前使用者的商品瀏覽歷史。二者個商品瀏覽歷史是在主站的cookie裡面儲存的。為了方便我們把COOKIE_DOMAIN都設定成了一樣的一級域名,使用js的cookie卻不能獲得設定好的cookie。但是,使用firebug + firecookie卻可以清楚的看到cookie是存在的且沒有過期。唯一不同的就好似cookie的domain和當前模組的domain一致(cookie是在主站設定好的emall.xxx.xxx,當前search的域名為search.emall.xxx.xxx)。 這很容易就讓人想到是cookie domain的問題導致的。問題原因找到了,解決它。使用js不行我就我就使用ajax的方式請求主站,在主站吧cookie取出來,然後再原樣的返回。編碼,執行,反先,ajax請求還是不能獲得(使用get的方式傳送請求)。把ajax請求的地址放在位址列裡面,確實有內容返回,但是使用ajax請求的話,還是不能獲得cookie的值。很顯然,這種情況就是傳說中的跨域請求的問題。這問題咱沒有解決過,怎麼辦那?突然想起來了,該模組下使用者登入資訊就是通過ajax非同步取出來的。同時ajax請求為什麼使用者的登入資訊可以拿到我的為什麼就拿不到???

找原因。找到請求使用者資訊的程式碼,才發現,原來請求的時候和我的ajax還有一點不一樣。請求使用者資訊的方式為:

JS程式碼如下:

複製程式碼 複製程式碼
    //跨域獲取資料
     jQuery.ajax({
        type : "GET",
        url : temp_domain_url+"/index.php?",
        data   : "act=get_user_info&php_session_id="+jQuery.cookie('COOKIE_ID')+"&jsoncallback=?",
        dataType : "jsonp",
        jsonnp : 'callback',
        success:function(data){
      ...
      ...
      ...
    }
  });
複製程式碼 複製程式碼

php程式碼如下:

複製程式碼 複製程式碼
function get_user_info()
{
    $gbh_goods_info = $_COOKIE['gbh_goods_info'] ? $_COOKIE['gbh_goods_info'] : json_encode(false);
        if ($gbh_goods_info && get_magic_quotes_gpc()) 
        {//沒有這個的話會出現錯誤
             $gbh_goods_info = stripslashes($gbh_goods_info);
        }
        $gbh_goods_info = json_decode($gbh_goods_info);
        echo $_GET['callback']."({msg: ".json_encode($gbh_goods_info)."});";
        exit;
    }

相關推薦

同一網站不同二級域名不同子目錄cookie 作用範圍問題

轉載連結 http://www.cnblogs.com/mitang/p/3884774.html 1、cookie二級域名的實現: 使用者其中一個站點登入,而且可以各個子頻道間切換,保持登入狀態設定Cookie時,使用如下程式碼即可: setcookie(name,val

同一網站不同二級域名不同子目錄cookie

1、cookie二級域名的實現: 使用者其中一個站點登入,而且可以各個子頻道間切換,保持登入狀態設定Cookie時,使用如下程式碼即可: setcookie(name,value,expire,path,"domain.com"); 這樣,在每個二級域名都能讀取這個Co

伺服器端tomcat配置,實現繫結二級域名不同埠釋出不同專案

配置版本tomcat7與jre1.6 注意:配置是一定要注意自己使用的版本,因為不同的版本配置可能略有些不同。博主就遇到了=-= 在伺服器配置時需要開啟tomcat安裝檔案目錄下的conf資料夾下sever.xml 一、實現繫結域名 進行一下配置 首先將預設8080介面改為80介

運用nginx阿里雲解析配置二級域名 設定不同埠號

server { listen 80 default_server; #監聽埠 root /mnt/aa; #訪問根目錄 index index.html index.htm; #預設頁,可以不設定 server_name www.ya

到底二級域名一級域名哪個更利於SEO

center 索引 能夠 進行 str height main 品牌 bsp 到底二級域名和一級域名哪個更利於SEO呢?本文是從百度官方轉載詳細的介紹:二級域名和一級域名的區別,請各位認真閱讀。 二級域名和子域名的區別可以通過以下3點來解讀: 一,二級域名的特點

二級域名一級域名的區別

組成 並且 一個 主機名 net 字符串 功能 上一個 存在 二級域名是依附在一級域名的存在而存在的,也就是說頂級域名消失了,二級域名也會不復存在,反過來說,二級域名網站不做了,主域名不受影響的。 作用: 1.一級域名又稱為頂級域名,大家需要註意的是,www.lisp.co

頂級域名二級域名共享cookie及相互刪除cookie

 在CSDN看到一個cookie設定domain時,如何刪除的問題,自己也只知道domain設定為頂級域名時可以被其他二級域名共享,但是如何刪除還是有一點搞不清楚,所以特意測試了下cookie和domain之間的關係,下面是一些測試結果的總結設定cookie   非頂級域名

一級域名是什麼?二級域名有什麼區別?

    在域名伺服器支援的情況下(一般都支援),修改域名的DNS伺服器地址為空間商的,然後在空間控制面板附加域名,以後的解析記錄和二級域名 需要在空間商那裡進行操作。     當然,二級域名和三級域名是免費的,只是大多伺服器會限制二級域名的數量。這樣可以造成泛解析,二級域名的具體形式主要以www為字首。類似

url進行重寫二級域名的url重寫

我們的專案有分站,分站也需要對url進行重寫。 我們主站採用的urlrewriter進行重寫。 這個方法還是不錯的,只需進行檔案的配置即可對url進行重寫,偽靜態。使用起來真的特別舒服。 具體使用方法可以百度、google 》 urlrewriter的使用 可是這個方法對二

說說域名二級域名主機名的聯絡區別

今天工作時候想把公司設定一個二級域名,如:shop.vertra.com。發現自己對這塊不是特別瞭解,現在總結一下: 域名:域名就是ip地址的解釋咯,可以通過dns把域名解析成ip地址,然後去訪問相應的站點,相信大家都已經很瞭解了,這裡就不多做解釋了。 二級域名:我們在

[hosts]在hosts中屏蔽一級域名二級域名的寫法

hosts nbsp 公開 www spa uda sts .com class   一級域名,如baidu: 0.0.0.0 baidu.com   二級域名 如有道公開課 0.0.0.0 ke.youdao.com

同一網站的多個域名之間訪問共享資訊

1. ContextSingleListener package test; import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;import or

linux中建立刪除變數,sh與變數的作用範圍之間的關係

a=1為定義了一個變數.注意定義變數的時候不能有等號 unset a取消定義的變數a 如果我定義一個變數a=4。然後編寫一個指令碼t1. 裡面的內容為echo 用於輸出a。但是此時並不能輸出a。因為a是一個外部的變數。他對於腳本里面是不可見的。 如果此時要在t1指令碼執行之

Nginx配置二級目錄/路徑 映射不同的反向代理規避IP+端口訪問

nbsp ade 直接 窗口 返回 ngs remote 測試 span 當配置Nginx來映射不同的服務器 可以通過二級路徑來反向代理 來解決一個外網端口實現多個服務訪問。 配置如下: server { listen 80; ser

用phpcms切換中英文網頁的方法(不用解析二級域名)、phpcms完成pc手機端切換(同一域名

msu 可用 解決 start 這就是 arp header 欄目 profile AA。phpcms進行雙語切換方法(不用解析二級域名) phpcms進行兩種語言的切換,有一把部分的人都是進行的二級域名的解析,這樣的話可能會有一部分的麻煩,我這裏有一種方法可以不用解析二級

vue給同一元素綁定單擊click雙擊事件dblclick,執行不同邏輯

部分 tab timeout 監聽 nbsp art dia method ons 在做項目過程中,需求是點擊孔位單擊彈出對話框查看產品總數,雙擊彈出對話框查看詳情。一開始直接click和dblclick寫在標簽裏面,但是不管怎麽樣,總是執行單擊事件 解決辦法:利用計時器,

Tomcat伺服器配置——使得伺服器繫結相關域名不同埠釋出不同專案

配置版本tomcat9與jre1.8 在伺服器配置時需要開啟tomcat安裝檔案目錄下的conf資料夾下sever.xml 進行一下配置 一、實現用域名開啟固定專案(預設開啟index.jsp) 將8080埠變成80埠 將localhost變成你的域名。本次配置域名為abc

奇怪!同一條sql語句在資料庫程式碼中執行結果不同?!當然是人錯了 ……

    sql語句就是它: select count(1) from syscolumns where [id]=object_id( 'tablecommon' )       判斷資料庫中

億豐科技:網站建設前如何選擇域名空間

在開始今天的文章之前,我想問各位站長一個問題:你對你的網站正在使用的域名和空間滿意嗎?在這些年的工作中,我見過太多的站長就是在網站上線前對域名和空間的選擇過於隨意,結果導致在後面的網站運營過程中出現過不少麻煩。其實,站長只要事先懂得買空間和域名時候的註意事項,這些所謂的麻煩都是能夠避免的。今天,我就來跟

iOS6iOS7處理push不同之處,解決反復push,-(void) application: didReceiveRemoteNotification: fetchCompletionHandl

前臺 啟動圖 nstat and bsp pro ica 應該 正文 如果讀者已經知道push的基本知識,本文僅僅是解決一些適配,兼容問題。如果對push 不甚了解,參考以下的文章 1.【iOS push全方位解析】(一) push的概述 2.【iOS push