Поиск…


замечания

Куки-файлы являются частью HTTP-запроса, поэтому неплохо сделать и то, и другое в контроллере, ответственность за который точно связана с запросом и ответом.

Чтобы установить файл cookie, т. Е. Создать его и запланировать отправку в браузер, вам нужно создать новый экземпляр класса \yii\web\Cookie и добавить его в коллекцию файлов ответов:

$cookie = new Cookie([
    'name' => 'cookie_monster',
    'value' => 'Me want cookie!',
    'expire' => time() + 86400 * 365,
]);
\Yii::$app->getResponse()->getCookies()->add($cookie);

В приведенном выше примере мы передаем параметры конструктору класса cookie. Они в основном такие же, как и с встроенной функцией setcookie PHP:

  • name - имя файла cookie.
  • value - значение cookie. Убедитесь, что это строка. Браузеры обычно недовольны двоичными данными в файлах cookie.
  • domain - домен, для которого вы настраиваете cookie.
  • expire - отметка времени unix, указывающая время, когда файл cookie должен быть автоматически удален.
  • path - путь на сервере, на котором будет доступен cookie.
  • secure - если true , cookie будет установлен только в том случае, если используется HTTPS.
  • httpOnly - если true , cookie будет недоступен через JavaScript.

Чтобы прочитать файл cookie, используйте следующий код:

$value = \Yii::$app->getRequest()->getCookies()->getValue('my_cookie');

Примечание. Этот код позволяет читать файлы cookie, которые были установлены с использованием компонента cookie (поскольку он по умолчанию определяет все файлы cookie). Поэтому, если вы добавляете / обновляете cookie с использованием JS-кода, вы не можете его прочитать с помощью этого метода (по умолчанию).

Куки для субдоменов

Из-за соображений безопасности куки-файлы по умолчанию доступны только в том же домене, из которого они были установлены. Например, если вы установили cookie на домен example.com , вы не можете получить его в домене www.example.com . Поэтому, если вы планируете использовать субдомены (например, admin.example.com, profile.example.com), вам необходимо явно указать domain :

$cookie = new Cookie([
    'name' => 'cookie_monster',
    'value' => 'Me want cookie everywhere!',
    'expire' => time() + 86400 * 365,
    'domain' => '.example.com' // <<<=== HERE
]);
\Yii::$app->getResponse()->getCookies()->add($cookie);

Теперь cookie можно прочитать из всех поддоменов example.com .

В случае автологина или «помнить меня» cookie применяются те же причуды, что и в случае куки-субдомена. Но на этот раз вам нужно настроить пользовательский компонент, установив массив identityCookie в желаемую конфигурацию cookie.

Откройте файл конфигурации приложения и добавьте параметры identityCookie в конфигурацию пользовательских компонентов:

$config = [
    // ...
    'components' => [
        // ...
        'user' => [
            'class' => 'yii\web\User',
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
            'loginUrl' => '/user/login',
            'identityCookie' => [ // <---- here!
                'name' => '_identity',
                'httpOnly' => true,
                'domain' => '.example.com',
            ],
        ],
        'request' => [
            'cookieValidationKey' => 'your_validation_key'
        ],
        'session' => [
            'cookieParams' => [
                'domain' => '.example.com',
                'httpOnly' => true,
            ],
        ],

    ],
];

Обратите внимание, что cookieValidationKey должен быть одинаковым для всех поддоменов.

Обратите внимание, что вам необходимо настроить свойство session::cookieParams чтобы иметь samedomain как ваш user::identityCookie чтобы обеспечить работу login и logout для всех поддоменов. Такое поведение лучше поясняется в следующем разделе.

Параметры cookie сеанса важны как в том случае, если вам нужно поддерживать сеанс при получении от одного субдомена к другому, либо, если наоборот, вы размещаете backend-приложение под /admin URL и хотите обрабатывать сеанс отдельно.

$config = [
    // ...
    'components' => [
        // ...
        'session' => [
            'name' => 'admin_session',
            'cookieParams' => [
                'httpOnly' => true,
                'path' => '/admin',
            ],
        ],
    ],
];


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow