Bastırmak için nasıl / PHP oturum çerezi kaldırmak

6 Cevap php

Ben zaten set oturum cookie başlığını bastırmak gerekiyor, ama bunu yapmak için herhangi bir yolu bulamıyor.

Why?
I need to make an image, sent by a PHP script, cacheable by the end user; this image is used to track if a newsletter has been read by the receiver, so if the image is requested I know the newsletter has been read. I only need to know when the newsletter gets opened for the first time, the subsequent requests can be ignored. The problem is that, even if I properly set the Expire and Cache-Control headers, the image is requested every time the user opens the newsletter--only that image used for the tracking--basically because it's not cached by the user. I used this tool to understand why the URL is not cacheable, and it says because of the cookie sent.

Ne önlemek istiyorsanız izleme görüntünün yük bir gecikme görülmeye kullanıcısıdır.

Bu yüzden web sitesi büyük ve karmaşık olduğu için, kaldırmak istemiyorum, benim web sitesi init fonksiyonu bir session_start() var, ve sadece ihtiyaç durumunda oturumu başlatmadan gibi bazı radikal değişim (bir yapım ben öngörülen çözümler) arzu değildir. session_start() PHPSESSID çerez ile Set-Cookie: başlığı ayarlar çağırarak, ve bunu kaldırmak gerekir. Böyle boş bir değer ile ayarlama çalıştı php.net üzerinde header() sayfadan okumaya

header('Set-Cookie:');
header('Set-Cookie:', true);
header('Set-Cookie: ');
header('Set-Cookie: ', true);

önce ve a session_write_close() çağrısı, ama elde edilen tüm kullanıcı header işlevi tam olarak yazıldığı gibi, herhangi bir değere olmadan, Set-Cookie: başlık aldığı sonra argüman.

Ben hala PHP 5.2 kullanıyorum söylemek gerekir, bu yüzden header_remove() Ben kılavuzda görmek fonksiyonu ve lighttpd 1.4.24 kullanamazsınız.

EDIT: bu yüzden, o benim başlıklarını kontrol etmek için kullanılan araç iyi değil gibi görünüyor. I curl --head ile başlıklarına baktım ve aşağıdaki başlıkları gördüm.

HTTP/1.1 200 OK
X-Powered-By: PHP/5.2.9
Set-Cookie: PHPSESSID=qn3ms55nvst2717e7b73qqu445; path=/
Last-Modified: Sun, 29 Mar 2009 21:53:36 GMT
ETag: "cb1dffff8c10db7b0a88794b1453cab8"
Expires: Sun, 20 Dec 2009 23:28:07 GMT
Cache-Control: private, max-age=2592000
Pragma: no-cache
Content-Type: image/png
Content-Length: 1322
Date: Fri, 20 Nov 2009 23:28:07 GMT
Server: lighttpd/1.4.24

Gördüğünüz gibi bir Pragma: no-cache ayarlanır. Ben kullanılan alet Pragma başlık kullanılan olmadığını söyledi, ama yanlış oldu. I Pragma: cache ayar denedim, ve posta istemcisi önbellek görüntüsü yaptı.

Ben header('Pragma:') ile Pragma başlığını kaldırmak değil çünkü belki Set-Cookie başlık unsetting imkansızlığı nedeniyle lighttpd biridir, başka bir keşif yaptı. PHP 5.3 için bekliyorum. Apache kullanarak birisi yukarıdaki header çağrı Pragma başlığını kaldırır teyit edebilir?

Aydınlatıcı açıklama :-) için teşekkürler txyoji

Bu noktada bu soru yalnızca değeri olmayan bir başlık belirleyerek başlıklarını kaldırmak değil lighttpd onaylamak için burada görünüyor.

6 Cevap

Dan session_destroy:

In order to kill the session altogether, like to log the user out, the session id must also be unset. If a cookie is used to propagate the session id (default behavior), then the session cookie must be deleted. setcookie() may be used for that.

Bu kod çalışır mı?

setcookie("PHPSESSID", 'foo', time()-3600);  /* expired 1 hour ago */

Başka bir çözüm bir PHP dosyası üzerinden görüntüyü hizmet olacaktır, bu nedenle istenen alır zaman, size veritabanını güncellemek ve bülten açıldı senin abone masaya bir bayrak ayarlayabilirsiniz. Daha temiz bir çözüm IMHO. Bu gibi bir kod ile görüntüyü gömmek olacaktır:

<img src="http://www.example.com/tracker.php?idhash=1234234"/>

idhash abone numarası artı bülten kimliği bir arada olabilir nerede.

Kullanıcı onların tarayıcısını kapattığında onlar sona kalmamak oturumların uzunluğunu arttırabilir miyim? Görüntü kullanıcı tarafından yüklenen ilk kez bir oturum değişkeni ayarlayın. Görüntü birden çok kez talep ise bu şekilde farketmez. Değişkeni ayarlanmamış zaman sadece db güncelleyin.

Eğer görüntü nedeniyle oturum çerezinin talep değil, sadece nedense E-Mail istemcisi herhangi bir önbelleği yapmaz çünkü emin misiniz?

Nasıl koşullu talep etti url bağlı oturum_ismi ile oturum tanımlama adı () değiştirme hakkında?

Bu deneyin:

header('Pragma:',true);

PHP bir set cookie başlık sizin oturumu başlattığınızda ilk kez göndermek olmaz.

Oturumu başladığında sizin session_cache_limiter () 'özel' olarak ayarlı ise nocache başlık: PHP pragma koyacaktır. Önbelleği izin istediğin, çağrı ise

session_cache_limiter('public')

session_start aramadan önce (). Bu php çevre oturumu autostart ayarlı ise, o zaman php.ini = kamu session.cache_limiter zorunda olduğu anlamına gelir ki,) (session_start önce olmalıdır.

PHP set cookie başlığını gönderiyorsa, o zaman dört şeyden biri oluyor.


1) The session is being started multiple times.


hiçbir kaynak - ama bir tek satırı PHP programı sizin için bu teyit edecektir.


session_start();        //  <-- cookie is not sent
session_start();        //  <-- does not count as a second start, nothing happens

session_start();        //  <-- cookie is not sent
session_write_close();  // session_destroy() counts as well
session_start();        //  <-- cookie is sent, since the session has been closed

İsteğinizi ve yanıt başlıklarını kontrol edin. Bu istekte olduğu gibi PHPSESSID değer yanıt olarak aynı ise, o zaman bu muhtemelen olan budur.


2) The session is being regenerated after it is started


PHP.NET - session_regenerate_id() - 4.3.3 için Değişiklikler


session_regenerate_id();

İsteğinizi ve yanıt başlıklarını kontrol edin. Bunlar farklı ise, o zaman bu ne oluyor muhtemelen.


3) The sessionid is being set prior to the session being started


PHP.NET - session_id - Parametreler


session_id('whatever');
session_start();

Bu bir kontrol etmek kolaydır. Bir çağrı session_start önce ve sorun;: her yerde kod session_id bir çağrı görürseniz, o da var ya da session_start bir aramadan sonra, ve o hiçbir şey yapmaz.

4) setcookie( session_name() , ... , ... ) is being called, setting the cookie manually somewhere


Hayır Kaynak


setcookie(session_name(),'a session id')
// or setcookie('PHPSESSID', 'a session id')

Bu bir de kontrol etmek kolaydır. Setcookie herhangi örnekleri için bak.