AccessControlAllowOrigin和AccessControlAllowCredentials。跨域共享 Cookie 在 Dedecms(织梦内容管理系统)中是一个常见的需求,特别是在涉及多个子域名或不同端口的情况下,以下是关于如何在 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 后台管理系统。
导航至“系统” > “系统配置参数” > “核心设置”。

找到“跨域共享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 配置文件中加入:

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。