HTTP正常的jQuery Ajax请求在HTTPS返回404错误排查求助
嗨,我来帮你梳理下这个问题~首先明确两个核心点:自签名证书本身一般不会直接导致404错误,但跨域的可能性确实存在,同时HTTPS环境下的服务器/框架配置问题才是404的更大概率原因,下面一步步拆解:
一、先排查是否是跨域问题
跨域的判定标准是协议、域名、端口三者必须完全一致,如果你的场景符合以下任意一种,就会触发跨域:
- 前端页面通过
https://你的域名访问,但Ajax的base_url用的是http://你的域名(协议不一致) - 前端是
https://localhost,但Ajax请求的base_url写的是https://127.0.0.1(域名/主机名不一致) - 前端和Ajax请求的端口不同(比如前端用443,Ajax请求80)
验证方法:
打开浏览器开发者工具(F12):
- 切换到「Network」标签,查看这个Ajax请求的完整地址,对比当前页面的地址,确认协议/域名/端口是否完全匹配
- 切换到「Console」标签,看是否有
Access-Control-Allow-Origin相关的跨域错误提示
如果确实是跨域,解决思路:
- 在CodeIgniter的
config.php里动态设置base_url,自动适配HTTP/HTTPS:$config['base_url'] = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://" . $_SERVER['HTTP_HOST'] . '/'; - 或者前端JS里动态获取当前页面的协议和主机名:
var base_url = window.location.protocol + '//' + window.location.host + '/';
二、排查HTTPS环境下的404核心原因
既然HTTP下一切正常,HTTPS下Ajax返回404,大概率是Apache的HTTPS虚拟主机配置或CodeIgniter路由的问题:
1. 检查Apache的HTTPS虚拟主机配置
确保HTTPS虚拟主机的DocumentRoot和HTTP的完全一致,并且必须开启AllowOverride All(因为CodeIgniter依赖.htaccess实现URL重写)。示例配置:
<VirtualHost *:443> ServerName your-domain DocumentRoot /var/www/html/your-codeigniter-project SSLEngine on SSLCertificateFile /path/to/your-selfsigned.crt SSLCertificateKeyFile /path/to/your-private.key <Directory /var/www/html/your-codeigniter-project> AllowOverride All Require all granted </Directory> </VirtualHost>
如果HTTPS虚拟主机没设置AllowOverride All,CodeIgniter的URL重写规则会失效,Apache会把Ajax请求的路由当成物理文件路径,直接返回404。
2. 验证CodeIgniter路由是否正常
在浏览器里直接访问Ajax的目标地址(比如https://你的域名/ajax_xxx),如果直接访问也返回404,说明是CodeIgniter的路由或控制器配置问题;如果直接访问正常,再回头检查Ajax代码里的请求路径是否拼写正确。
3. 检查.htaccess文件
确保.htaccess规则在HTTPS环境下也能正常工作,避免规则里的协议判断误拦截请求。标准的CodeIgniter .htaccess应该是这样的:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
三、自签名证书的额外注意点
虽然自签名证书不会直接导致404,但如果浏览器因为证书不被信任而阻断请求,可能表现为请求失败(但通常是net::ERR_CERT_AUTHORITY_INVALID这类错误,不是404)。你可以在浏览器「Console」标签里查看是否有SSL相关警告,如果有的话,手动信任自签名证书即可(比如Chrome里点击地址栏警告图标,选择「高级」->「继续访问」)。
建议你按这个顺序排查:先验证Ajax的目标URL在HTTPS下能否直接访问,再检查Apache的HTTPS虚拟主机配置,最后确认是否存在跨域问题。
内容的提问来源于stack exchange,提问作者Eloise85

