cms绑定二级域名后,会员登录后,无法评论,cms里不是登录状态

这是因为你绑定二级域名后,Cookie域不同了,可以通过以下修改来实现同域。

首先需要打开application/config.php

修改其中的url_domain_deploy改为true

因为我们是多域名了,还需要设置sessioncookie的域名,如下:

'session'                => [
    'id'             => '',
    // SESSION_ID的提交变量,解决flash上传跨域
    'var_session_id' => '',
    // SESSION 前缀
    'prefix'         => 'think',
    // 驱动方式 支持redis memcache memcached
    'type'           => '',
    // 是否自动开启 SESSION
    'auto_start'     => true,
    // SESSION存储目录,可选
    //'path'           => RUNTIME_PATH . 'session',
    // 共享域名
    'domain'         => 'yoursite.com'
],
'cookie'                 => [
    // cookie 名称前缀
    'prefix'    => '',
    // cookie 保存时间
    'expire'    => 0,
    // cookie 保存路径
    'path'      => '/',
    // cookie 有效域名
    'domain'    => 'yoursite.com',
    //  cookie 启用安全传输
    'secure'    => false,
    // httponly设置
    'httponly'  => true,
    // 是否使用 setcookie
    'setcookie' => true,
],

注意domain为你的根域名

配置完成后注意清除runtime的缓存和浏览器缓存,包含Cookie信息都需要清除。

跨域说明

如果你有其它页面接口调用api.yoursite.com时可能出现跨域问题,我们可以修改/public/assets/js/fast.js,修改其中的Fast.api.ajax方法,修改为

ajax: function (options, success, error) {
    options = typeof options === 'string' ? {url: options} : options;
    var index = Layer.load();
    options = $.extend({
        type: "POST",
        dataType: "json",
        xhrFields: {
            withCredentials: true
        },
        success: function (ret) {
            Layer.close(index);
            ret = Fast.events.onAjaxResponse(ret);
            if (ret.code === 1) {
                Fast.events.onAjaxSuccess(ret, success);
            } else {
                Fast.events.onAjaxError(ret, error);
            }
        },
        error: function (xhr) {
            Layer.close(index);
            var ret = {code: xhr.status, msg: xhr.statusText, data: null};
            Fast.events.onAjaxError(ret, error);
        }
    }, options);
    $.ajax(options);
},

其中的

xhrFields: {
    withCredentials: true
},

是我们新增加的代码,注意因为涉及修改了核心文件,需要使用php think min -m all -r js重新压缩打包下JS代码

然后我们再修改我们Api的基类application/common/controller/Api.php,在_initialize中添加以下代码

if (isset($_SERVER['HTTP_ORIGIN'])) {
    header("Access-Control-Allow-Origin: " . $this->request->server('HTTP_ORIGIN'));
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 86400');    // cache for 1 day
}
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
}

即可。

posted @ 2020-02-10 12:34  阿波罗任先生  阅读(230)  评论(1编辑  收藏  举报