Removing cookies with the same name but different paths

JKown picture JKown · Sep 20, 2011 · Viewed 17.7k times · Source

I need to delete clientside cookies with the same name but with different paths. What is the best way to do this in javascript.

Answer

Jonathan Lonowski picture Jonathan Lonowski · Sep 20, 2011

Just specify the same path of the cookie you want to remove, giving it a past expiration.

document.cookie = 'name=value1; path=/';
document.cookie = 'name=value2; path=/path/';

alert(document.cookie); // name=value1; name=value2


document.cookie = 'name=; path=/path/; expires=' + new Date(0).toUTCString();

alert(document.cookie); // name=value1

Changing it to expire the cookie with a path of / will still only expire one of the cookies -- the path given has to match the path set:

document.cookie = 'name=; path=/; expires=' + new Date(0).toUTCString();

alert(document.cookie); // name=value2

To remove both, you'll have to expire each with their path:

document.cookie = 'name=; path=/; expires=' + new Date(0).toUTCString();
document.cookie = 'name=; path=/path/; expires=' + new Date(0).toUTCString();

alert(document.cookie); // {blank}

Now, these examples assume you're browsing /path/ or a sub-directory of it.


[edit]

To remove in bulk, try something like this:

function expireAllCookies(name, paths) {
    var expires = new Date(0).toUTCString();

    // expire null-path cookies as well
    document.cookie = name + '=; expires=' + expires;

    for (var i = 0, l = paths.length; i < l; i++) {
        document.cookie = name + '=; path=' + paths[i] + '; expires=' + expires;
    }
}

expireAllCookies('name', ['/', '/path/']);

Demo: http://jsfiddle.net/M2dZ3/

You can also fake path lookups by splitting and iterating window.location.pathname:

function expireActiveCookies(name) {
    var pathname = location.pathname.replace(/\/$/, ''),
        segments = pathname.split('/'),
        paths = [];

    for (var i = 0, l = segments.length, path; i < l; i++) {
        path = segments.slice(0, i + 1).join('/');

        paths.push(path);       // as file
        paths.push(path + '/'); // as directory
    }

    expireAllCookies(name, paths);
}

Demo: http://jsfiddle.net/M2dZ3/2/