如何实现DEDECMS跨域共享Cookie的域名?实际方法探讨

在dedecms中实现跨域共享cookie,需在响应头中设置AccessControlAllowOriginAccessControlAllowCredentials

跨域共享 Cookie 在 Dedecms(织梦内容管理系统)中是一个常见的需求,特别是在涉及多个子域名或不同端口的情况下,以下是关于如何在 Dedecms 中实现跨域共享 Cookie 的详细方法:

如何实现DEDECMS跨域共享Cookie的域名?实际方法探讨

1. 修改 Dedeajax2.js 文件

需要修改 Dedecms 的dedeajax2.js 文件,以确保 AJAX 请求能够携带 Cookie 信息,具体步骤如下:

打开/include/dedeajax2.js 文件。

找到以下代码段:

  DedeXHTTP = new XMLHttpRequest();

在该代码下方添加:

  DedeXHTTP.withCredentials = true;

继续找到以下代码段:

  DedeXHTTP.open("POST", purl, true);

在该代码下方添加:

  DedeXHTTP.withCredentials = true;

同样地,对于DedeXHTTP.open("GET", purl, true);DedeXHTTP.open("GET", purl, false); 也分别添加DedeXHTTP.withCredentials = true;

配置后台系统参数

在 Dedecms 后台系统中,需要设置跨域共享 Cookie 的域名,具体步骤如下:

登录 Dedecms 后台管理系统。

导航至“系统” > “系统配置参数” > “核心设置”。

如何实现DEDECMS跨域共享Cookie的域名?实际方法探讨

找到“跨域共享cookie的域名”选项,填入主域名(例如.91084.com),注意,前面有一个英文小数点。

保存修改。

如果在此过程中出现验证码错误的问题,可能是因为 Dedecms 程序不是最新版本,需要替换官方最新版的两个文件:/include/common.inc.php/include/vdimgck.php,记得在替换前备份原文件。

启用 CORS

为了解决浏览器跨域拦截的问题,需要在服务器端启用 CORS(跨域资源共享),这可以通过在 AJAX 请求的 PHP 文件中添加响应头来实现,具体步骤如下:

方法一:在 AJAX 请求的 PHP 文件中添加响应头

在处理 AJAX 请求的 PHP 文件中(如member/ajax_loginsta.php),添加以下代码:

header("AccessControlAllowCredentials:true");
header("AccessControlAllowOrigin:http://bbs.91084.com");

如果有多个 AJAX 请求文件,也需要在这些文件中添加同样的代码。

方法二:在网站环境配置中添加响应头

根据使用的服务器类型(Apache、Nginx、IIS),在相应的配置文件中添加响应头,注意,如果使用了方法一,则不需要再使用方法二。

Apache 环境

conf 配置文件中加入:

如何实现DEDECMS跨域共享Cookie的域名?实际方法探讨

Header set AccessControlAllowOrigin "*"

Nginx 环境

在配置文件中加入:

add_header AccessControlAllowOrigin *;
add_header AccessControlAllowCredentials true;
add_header AccessControlAllowHeaders "xrequestedwith,Authorization";
add_header AccessControlAllowMethods *;

IIS 环境

在 IIS 管理器中,找到“HTTP 响应标头”,然后添加以下标头:

AccessControlAllowOrigin *
AccessControlAllowCredentials true
AccessControlAllowHeaders xrequestedwith,Authorization
AccessControlAllowMethods

在子域名模板中使用主域名的文件路径

在子域名的模板中,如果有通过 AJAX 获取会员登录状态数据的地方,需要使用主域名的文件路径。

<script type="text/javascript" src="{dede:global.cfg_basehost}/include/dedeajax2.js"></script>
<script type="text/javascript">
function CheckLogin(){
    var taget_obj = document.getElementById('_userlogin');
    myajax = new DedeAjax(taget_obj,false,false,'','','');
    myajax.SendGet2("{dede:global.cfg_basehost}/member/ajax_loginsta.php");
    DedeXHTTP = null;
}
</script>

表格示例

为了更清晰地展示上述步骤,下面是一个表格示例,归纳了关键步骤和对应的操作:

步骤 操作
1 修改/include/dedeajax2.js 文件,添加DedeXHTTP.withCredentials = true;
2 在 Dedecms 后台“系统配置参数”中设置“跨域共享cookie的域名”为.91084.com
3 在处理 AJAX 请求的 PHP 文件中添加响应头,或在服务器环境中配置 CORS
4 在子域名模板中使用主域名的文件路径进行 AJAX 请求

FAQs

Q1: 如果跨域共享 Cookie 时出现验证码错误怎么办?<br>

A1: 如果在使用 Dedecms 跨域共享 Cookie 时出现验证码错误,可能是因为 Dedecms 程序不是最新版本,解决方法是替换官方最新版的两个文件:/include/common.inc.php/include/vdimgck.php,记得在替换前备份原文件。

Q2: 为什么需要设置 CORS?<br>

A2: CORS(跨域资源共享)是一种浏览器安全功能,用于限制从一个源加载的网页如何与另一个源交互,它可以帮助防止跨站请求伪造攻击(CSRF),通过设置 CORS,可以允许特定域或所有域访问资源,从而实现跨域共享 Cookie。