Обнаруживать, разрешены ли cookie в PHP

Я пытаюсь определить, включен ли cookie пользователя на моей странице или нет. Следующий код выполняет проверку, но я не знаю, как перенаправить пользователя на страницу, из которой они пришли.

script запускает сеанс и проверяет, проверяет ли он файлы cookie. Если нет, он перенаправляет пользователя на тестовую страницу, и, поскольку я вызывал session_start() на первой странице, я должен увидеть файл cookie PHPSESSID, если в пользовательском агенте включены файлы cookie.

Проблема в том, что ths script может быть вызван с любой страницы моего сайта, и мне придется перенаправить их обратно на их выбранную страницу, скажем, index.php? page = news & postid = 4.

session_start();
// Check if client accepts cookies //
if (!isset($_SESSION['cookies_ok'])) {
    if (isset($_GET['cookie_test'])) {
        if (!isset($_COOKIE['PHPSESSID'])) {
            die('Cookies are disabled');
        } else {
            $_SESSION['cookies_ok'] = true;
            header(-------- - ? ? ? ? ? -------- -);
            exit();
        }
    }
    if (!isset($_COOKIE['PHPSESSID'])) {
        header('Location: index.php?cookie_test=1');
        exit();
    }
}

Ответ 1

Я думаю, что лучше сделать один файл cookie cookie и перенаправить на другой файл. Затем следующий файл может проверить значение и определить, включено ли cookie. См. Пример.

Создайте два файла, cookiechecker.php и stat.php

// cookiechecker.php
// save the referrer in session. if cookie works we can get back to it later.
session_start();
$_SESSION['page'] = $_SERVER['HTTP_REFERER'];
// setting cookie to test
setcookie('foo', 'bar', time()+3600);
header("location: stat.php");

и

stat.php

<?php if(isset($_COOKIE['foo']) && $_COOKIE['foo']=='bar'): 
// cookie is working
session_start();
// get back to our old page
header("location: {$_SESSION['page']}");
else:            // show the message ?>
cookie is not working
<? endif; ?>

Загрузите cookiechecker.php в браузере, он скажет cookie is working. Вызовите его с командной строкой, как curl. Он скажет: cookie is not working


Update

Вот одно решение для файла.

session_start();

if (isset($_GET['check']) && $_GET['check'] == true) {
    if (isset($_COOKIE['foo']) && $_COOKIE['foo'] == 'bar') {
        // cookie is working
        // get back to our old page
        header("location: {$_SESSION['page']}");
    } else {
        // show the message "cookie is not working"
    }
} else {
    // save the referrer in session. if cookie works we can get back to it later.
    $_SESSION['page'] = $_SERVER['HTTP_REFERER'];
   // set a cookie to test
    setcookie('foo', 'bar', time() + 3600);
    // redirecting to the same page to check 
    header("location: {$_SERVER['PHP_SELF']}?check=true");
}

Ответ 2

HTTP_REFERER не работал у меня, похоже, что REQUEST_URI - это то, что мне нужно.

Вот код, который я наконец использовал:

session_start();
// ------------------------------- //
// Check if client accepts cookies //
// ------------------------------- //

if( !isset( $_SESSION['cookies_ok'] ) ) {
    if( isset( $_GET['cookie_test'] ) ) {
        if( !isset( $_COOKIE['PHPSESSID'] ) ) {
            die('Cookies are disabled');
            }
        else {
            $_SESSION['cookies_ok'] = true;
            $go_to = $_SESSION['cookie_test_caller'];
            unset( $_SESSION['cookie_test_caller'] );
            header("Location: $go_to");
            exit();
            }
        }
    if( !isset( $_COOKIE['PHPSESSID'] ) ){
        $_SESSION['cookie_test_caller'] = $_SERVER['REQUEST_URI'];
        header('Location: index.php?cookie_test=1');
        exit();
        }
    }
// ------------------------------- //

Ответ 3

Нет необходимости сохранять исходный URL-адрес и перенаправлять его потом. Вы можете выполнить прозрачную переадресацию через AJAX, которая не вызывает перезагрузку страницы. Это очень просто реализовать. Вы можете проверить мой пост здесь: fooobar.com/questions/95638/...

Ответ 4

Я думаю, что это самое простое решение. Не требует отдельных файлов и позволяет использовать script, если файлы cookie включены:

$cookiesEnabled = true;

if (!isset($_COOKIE['mycookie'])) {
    $cookiesEnabled = false;
    if (!isset($_GET['cookie_test'])) {
        setcookie('mycookie', 1, 0, '/');
        @ob_end_clean();
        $_SESSION['original_url'] = $_SERVER['REQUEST_URI'];
        $uri = $_SERVER['REQUEST_URI'];
        $uri = explode('?', $uri);
        $q = (isset($uri[1]) && $uri[1])?explode('&', $uri[1]):array();
        $q[] = 'cookie_test=1';
        $uri[1] = implode('&', $q);
        $uri = implode('?', $uri);
        header('Location: '.$uri);
        die;        
    }
} else if (isset($_GET['cookie_test'])) {
    @ob_end_clean();
    $uri = $_SESSION['original_url'];
    unset($_SESSION['original_url']);
    header('Location: '.$uri);
    die;    
}

// if (!$cookiesEnabled) ... do what you want if cookies are disabled