2009-12-28 42 views
7

路徑參數可以添加到$ _COOKIE []嗎? 。如何使用PHP訪問同一個域的不同路徑上的cookie值?

+0

您可能會發現['$ cookie-> setPath($ path)'](https://github.com/delight-im/PHP-Cookie/blob/004cde69ec840e65c15275e09b92ecb1da06f357/src/Cookie。php#L104)有幫助,在[這個獨立的庫](https://github.com/delight-im/PHP-Cookie)中找到。 – caw 2016-09-21 03:09:27

回答

9

如果您嘗試訪問爲當前域設置的同一域上的其他路徑設置的Cookie,則無法完成此操作。瀏覽器本身限制了這一點,只發送適合當前路徑的cookies。

+0

Facebook怎麼樣?,Facebook爲域名「facebook.com」寫入cookie,但它使用來自「www.facebook.com」的這個cookies – user962284 2012-06-07 23:42:49

+0

@ user962284你確定嗎?我很確定FB在www.facebook.com上設置了所有的cookies,因爲它甚至無法訪問facebook.com(他們將您重定向到www) – 2012-06-08 16:18:28

+0

這是不正確的。遵循RFC *建議的瀏覽器會在多個cookie具有相同名稱但路徑不同的情況下將這兩個值發回。實際上,PHP是阻礙它的;請看我發佈的答案。 – 2014-06-15 02:44:09

2

是的,這是第四個參數,但你只能夠訪問該cookie,如果它是使用當前目錄所在的路徑設置

這混亂......這是從PHP:

Cookie將在其上可用的服務器上的路徑。如果設置爲 '/',則Cookie將在整個域中可用 。如果設置爲 '/ foo /',則該cookie將僅在和/或域的所有子目錄(如 /foo/bar /)內可用的 。默認 值是 餅乾正在被設定的當前目錄。

http://php.net/manual/en/function.setcookie.php

你訪問它像任何其他的cookie。如果腳本有權訪問它,它將在$ _COOKIE中可用。

+0

我的意思是如何讀取它,如何訪問不同路徑中的cookie值,但在相同的域名? – Steven 2009-12-28 05:32:06

+0

如何區分它們? – Steven 2009-12-28 05:32:36

+0

php不會爲你做。你將不得不自己實現。 – Galen 2009-12-28 06:21:01

2

不,這樣的參數是不可能的,因爲瀏覽器不會將路徑發送到服務器。它只發送每個cookie的名稱和值(所以你不能看到路徑,如果它是一個會話cookie,它會到期等)。

2

我不認爲有可能從不同的路徑獲取cookie,因爲它可能會導致安全問題。

4

雖然HTTP客戶端(即:瀏覽器)沒有發回cookie設置的路徑,但PHP實際上會對其數組的cookie進行假設。

如果設置兩個cookie具有相同名稱,一個值爲「第一價值」與路徑/和第二值爲「第二值」與路徑/測試,瀏覽器繼推薦 - 但不是必需的 - RFC中的行爲會將這兩個值發回給您。當你/測試路徑下訪問一個URL,瀏覽器發送的:

Cookie: name=second-value, name=first-value 

「問題」是,PHP只讀取第一個值 - $ _COOKIE [「名」]將只包含沒有提示「第一值」存在的值「第二值」。如果您需要訪問這兩個值,則需要自己分析$ _SERVER ['HTTP_COOKIE']的值 - 對於上例,這將包含「name = second-value,name = first-value」。請注意,「第二個值」首先在行,因爲它設置了較長的路徑。請注意RFC不保證這種行爲,它只是說HTTP客戶端應該這樣做。

+0

有趣的是,這是特定於子目錄嗎?如在中,對子目錄的請求將收到根的cookie,但對根的請求不會接收子目錄的cookie?另外我很好奇瀏覽器是否實際執行此操作:) – 2014-06-15 09:08:25

+0

更正,子目錄或更長的路徑將始終收到一個匹配較短路徑的cookie。所有瀏覽器都以這種方式實現。唯一不能保證的行爲是,如果你有多個具有相同名稱但路徑不同的cookie - 你應該*以一個固定的順序接收這兩個cookie,但RFC不作任何承諾。 – 2014-06-26 18:05:35

+0

這實際上是正確答案,因爲它給出了爲什麼發生這種情況的完整解釋。我應該注意到,雖然你不能告訴'$ _COOKIE []'一個路徑,但是這個缺失,你可以告訴'setcookie'一個路徑。我們正在用API來面對這個問題。所以你可以告訴'setcookie'設置根路徑,然後在任何地方訪問它,例如:'setcookie('name','data',expire,'/')'。最後一個參數是路徑並將其設置爲'/'使其成爲根路徑。這將解決OP的問題。 – jfreak53 2014-10-24 15:48:31

相關問題