切换协议时,Laravel会话无效(https为http或http为https)

Ana*_*nam 6 php laravel laravel-4

我目前正在开发一个应用程序,我必须使用几页SSL.例如,登录,注册页面.然而,当协议之间进行切换httpshttp,Laravel会话不被传输通过HTTP.

是否有任何解决方案,Laravel将保留两个协议的会话.

Tim*_*eld 4

默认情况下,Laravel 为身份验证和会话 cookie 设置 secure 和/或 httponly。我找不到在配置中更改此设置的方法,事实上在 Laravel 4.0 中(不再是这种情况),httponly 被硬编码为设置vendor/laravel/framework/src/Illuminate/Session/SessionManager.php

请注意,您不应将 cookie 从 HTTPS 泄漏到 HTTP,因为这会阻止您确保会话安全(例如,我仍然可以嗅探网络上登录到您网站的其他用户的会话)。

拉拉维尔 4.1+

编辑app/config/session.php'secure'如果您希望在 https 上设置的 cookie 也能在 http 上读取,请将密钥更改为 false。

或者,遵循 @martinstoeckli 的建议并根据您的环境的值设置密钥。

拉拉维尔 4.0

也许实现这一点的最佳方法是用CookieSessionHandler您自己的处理程序替换。

例如,可以创建一个新类,该类将使用更新的写入函数扩展 CookieSessionHandler,该写入函数会将所有 cookie 标记为不仅仅适用于 https/http。

Class NewCookieSessionHandler extends CookieSessionHandler implements \SessionHandlerInterface {
    /**
     * {@inheritDoc}
     */
    public function write($sessionId, $data)
    {
        // $this->cookie is \Illuminate\Cookie\CookieJar
        $this->setCookie($this->cookie->make($sessionId, $data, $this->minutes, '/', false, false));
    }

    /**
     * Set the given cookie in the headers.
     *
     * @param  \Symfony\Component\HttpFoundation\Cookie  $cookie
     * @return void
     */
    protected function setCookie($cookie)
    {
        if (headers_sent()) return;

        setcookie($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), false, false);
    }
    
}
Run Code Online (Sandbox Code Playgroud)

然后在里面app/config/session.php你可以将驱动程序更改为NewCookie

最后在里面app/start/global.php注册新的 cookie 驱动程序来覆盖 cookie 的设置

use Illuminate\Cache\Repository;

Cookie::extend('NewCookie', function($app)
{
    return new NewCookieSessionHandler;
});
Run Code Online (Sandbox Code Playgroud)