2012-04-12 69 views
2

我正在使用RewriteRule在htaccess中創建烹飪。在我的測試中,我根本無法讓這個cookie消失。這裏是我如何創建的cookie,這讓我在this thread幫助:PHP Cookie破壞不起作用,我做錯了什麼?

[L,CO=redirect_indicator:yes:.www.example.com,R=301] 

因此該cookie默認的過期時間應該是在瀏覽會話的只是時間。我試圖在我的腳本結尾處銷燬它,結果令人困惑。在我的腳本結束時,我運行下面的(從another stack thread here幫助)我有

var_dump($_COOKIE['redirect_indicator']); 

然後:

所以,我將做到這一點,在我的腳本的頂部看到的cookie用於測試目的試着簡單得多破壞腳本比這很好,但沒有人可以做的伎倆:

if (isset($_SERVER['HTTP_COOKIE'])) { 
    $cookies = explode(';', $_SERVER['HTTP_COOKIE']); 
    foreach($cookies as $cookie) { 
     $parts = explode('=', $cookie); 
     $name = trim($parts[0]); 
     setcookie($name, '', time()-1000); 
     setcookie($name, '', time()-1000, '/'); 
    } 
} 

現在,代碼段後,我也再次運行此:

var_dump($_COOKIE['redirect_indicator']); 

事實上,cookie不在那裏!這很好,但只要我在不應該生成cookie的頁面上再次運行腳本,該cookie在我的第一個var_dump期間仍然顯示。

無論如何擺脫這個cookie或將我總是在瀏覽器存儲的東西的擺佈。當我重新啓動瀏覽器時,它確實消失了,但在腳本執行後我需要這個東西消失。

+4

每次請求通過設置Cookie的重寫規則時,cookie都會重新設置。如果每次請求都發生這種情況,那麼無論您是否嘗試取消設置,它都會在每次請求時重新創建。如果你不想銷燬所有的cookies,爲什麼不''foreach($ _COOKIE as $ name => $ val)setcookie($ name,'',1);'? – DaveRandom 2012-04-12 17:03:05

+0

我基本上使用cookie作爲重定向的標記,讓我知道這個人正在嘗試訪問的舊url(現在是301'd),舊ulr告訴我我需要發送它們的位置。問題是我使用相同的腳本來重定向每個人,但不是每個鏈接都會觸發cookie。所以我的噩夢場景是有人使用獲取cookie的鏈接,但後來又回到了另一個不會觸發cookie的鏈接,但cookie仍然存在,我無法處理它。 – absentx 2012-04-12 19:50:38

回答

1
setcookie($name, '', time()-1000); 

上面確實設置在過去這是刪除Cookie的唯一途徑到期 - 然而,cookie將不會從用戶的計算機上,直到所有的瀏覽器窗口被關閉刪除。

如果需要cookie來不再影響腳本,重置價值的東西,你以後可以作爲例外規定,例如「刪除」

if(isset($_COOKIE['redirect_indicator']) && $_COOKIE['redirect_indicator'] !== 'delete') 
+0

我正在使用此解決方案,但仍然無法擊敗評論@DaveRandom中所述的噩夢場景。例如,如果我使用像解決方案那樣的異常變量,那麼當他們回到沒有設置cookie並且沒有在腳本中使用它的頁面時,這非常棒,但是如果他們再次點擊鏈接設置cookie? Wooooo我可以在htacces中取消設置異常Cookie嗎? – absentx 2012-04-12 19:51:35

+0

如果他們再次點擊設置cookie的鏈接,該值將從「刪除」改回到其具有的任何功能值。我並不完全瞭解問題所在。如果您需要cookies來保留每個301的網址,但爲其他人刪除,爲什麼不將cookie的密鑰指定爲url的唯一內容? – squarephoenix 2012-04-12 20:01:27

+0

看到我想這就是我遇到的問題。即使我將$ _COOKIE ['reset_indicator']重置爲腳本底部的「已刪除」,它仍然按照最初設置爲刷新腳本時的原樣讀取。而且,我當然會指定密鑰,但我還沒有達到那個目的,因爲我很難讓cookie取得我想要的值,而不是htaccess設置的值。我很快會看到我能否提供更多信息。 – absentx 2012-04-12 20:07:19

1

的幾點思考:

(1 )在你的腳本中你讀出了$ _COOKIE,然後你覆蓋了一個cookie,然後再看$ _COOKIE。 $ _COOKIE在此期間是否已更新?當用戶在http://www.php.net/manual/en/reserved.variables.cookies.php貢獻注云:

的$ _COOKIE的值由用戶代理的請求,收到餅乾的內容確定

如果設置一個cookie(即其發送到。它將不會被髮回,直到下一個請求,所以數據將不會出現在$ _COOKIE中。

您對$ _COOKIE的第二次調用只是保留了這個變量在你的腳本開始。看看你的瀏覽器,看看你的cookie是否被更改或刪除,而不是$ _COOKIE。 (2)在你鏈接到的線程中,它表示你的。htaccess的應該說:

RewriteRule ^example/directory/go\.php$ example.com/go.php [L,CO=tracker:yes:.example.com,R=301] 

不是:

[L,CO=redirect_indicator:yes:.www.example.com,R=301] 

爲你寫的。難道是因爲你忘記了該行的第一部分,並且你的[flags]因此被應用於任何RewriteRule上面,甚至是每個被調用的頁面?

(3)你爲什麼不你重定向一起傳遞舊的URL而不是保存在cookie中的:

RewriteRule ^(example/directory/go\.php)$ example.com/go.php?old=$1 [R=301] 

然後,您可以解析$ _GET [「老」]在go.php 。

+0

這可能是一個選項,非常感謝!在回答你的第一個問題時,我確實有原始文章中指出的重寫規則,我只是爲了該文章的目的而發佈了Cookie部分。但我沒有真正諮詢瀏覽器的cookie值,所以我一定會這樣做。 – absentx 2012-04-15 22:36:56