You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AJAX跨域与摘要认证问题:无需禁用Chrome安全机制实现访问?

解决CORS、自签名证书与Digest认证的跨域请求问题

首先得明确几个关键问题的根源,你现在遇到的问题其实是两个核心点:CORS配置逻辑搞反和自签名证书不被浏览器信任,咱们逐个拆解解决:

1. 修复CORS问题(核心!客户端加Access-Control-Allow-Origin是完全错误的)

你之前在请求里加Access-Control-Allow-Origin头是搞反了——这个头是服务器必须返回给客户端的响应头,不是客户端发给服务器的请求头。所以得在树莓派的Apache2上配置CORS规则,具体步骤:

步骤1:启用Apache的必要模块

SSH到树莓派,执行命令开启需要的模块:

sudo a2enmod headers
sudo a2enmod rewrite
sudo systemctl restart apache2

步骤2:给目标接口配置CORS规则

有两种方式,选一种适合你的场景:

  • 方式一:针对单个接口(比如你的/x接口)
    编辑Apache的站点配置文件(比如/etc/apache2/sites-available/000-default.conf),在<VirtualHost *:443>块里添加:

    <Location "/x">
        # 允许你的前端域名跨域(替换成实际前端地址,比如http://192.168.0.111)
        Header set Access-Control-Allow-Origin "http://192.168.0.111"
        # 允许携带认证信息(Digest认证必须开启这个)
        Header set Access-Control-Allow-Credentials "true"
        # 允许的请求头(至少包含Digest认证相关的Authorization)
        Header set Access-Control-Allow-Headers "Authorization, Content-Type"
        # 允许的请求方法
        Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
    
        # 处理OPTIONS预检请求(复杂跨域请求会先发OPTIONS,直接返回200即可)
        RewriteCond %{REQUEST_METHOD} OPTIONS
        RewriteRule ^(.*)$ $1 [R=200,L]
    </Location>
    
  • 方式二:全局配置CORS
    创建/etc/apache2/conf-available/cors.conf,内容如下:

    <IfModule mod_headers.c>
        # 指定允许的前端域名,不能用*(*和Allow-Credentials不能同时生效)
        Header set Access-Control-Allow-Origin "http://192.168.0.111"
        Header set Access-Control-Allow-Credentials "true"
        Header set Access-Control-Allow-Headers "Authorization, Content-Type"
        Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
    
        RewriteCond %{REQUEST_METHOD} OPTIONS
        RewriteRule ^(.*)$ $1 [R=200,L]
    </IfModule>
    

    然后启用这个配置并重启Apache:

    sudo a2enconf cors
    sudo systemctl restart apache2
    

2. 解决自签名证书被浏览器拦截的问题(无需客户端手动信任)

自签名证书在正常浏览器里会被标记为不安全,要避免客户端手动操作,有两个可行方案:

方案一:使用Let's Encrypt免费可信证书(推荐)

如果你的树莓派能访问外网,直接用Certbot申请免费的可信证书,步骤:

  1. 安装Certbot:
    sudo apt update
    sudo apt install certbot python3-certbot-apache
    
  2. 运行Certbot自动配置Apache:
    sudo certbot --apache
    
    按照提示完成域名验证(需要你的域名解析到树莓派的公网IP,内网环境可以用certbot certonly --manual手动验证)。申请完成后,Certbot会自动配置HTTPS站点,证书还会自动续期,浏览器会完全信任这个证书。

方案二:搭建内网CA(适合纯内网环境)

如果树莓派不能访问外网,你可以搭建一个内网CA,生成CA证书后,把CA证书部署到所有客户端的信任根证书库(比如Windows用组策略批量推送,Mac用配置文件,Linux手动导入),然后用这个CA给树莓派的Apache签发证书。这样所有客户端浏览器都会信任这个证书,不需要手动接受。

3. 前端代码调整(无需修改请求头)

你的前端代码本身没问题,只要服务器CORS配置正确、证书被信任,直接用原来的代码就行:

$.ajaxDigest('https://192.168.0.100/x',{ username: 'user', password: 'pass' })
.done(function(data, textStatus, jqXHR) { 
    alert('Retrieved data!'); 
    alert(JSON.stringify(data, null, 4)); 
})
.fail(function(jqXHR, textStatus, errorThrown) { 
    alert('Request failed :('); 
});

验证步骤

  1. 重启Apache后,打开正常Chrome访问前端页面,查看控制台是否还有CORS错误。
  2. 访问https://192.168.0.100,确认浏览器地址栏显示安全锁,没有证书警告。
  3. 触发接口请求,测试是否能正常获取JSON数据。

内容的提问来源于stack exchange,提问作者Kai K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:01:52