无法在JQUERY AJAX的GET请求中传递API密钥(授权令牌)
我来帮你捋捋这个问题——本地XAMPP环境一切正常,Postman测API也没问题,偏偏部署到000webhost就报400错误说“API Key is missing”,大概率是请求头的传递环节出了问题,或者虚拟主机的服务器配置限制导致令牌没被正确读取。下面是几个你可以挨个尝试的排查方向:
1. 先确认AJAX请求真的带上了令牌头
打开浏览器的开发者工具(按F12切换到Network面板),找到那个失败的GET请求,查看它的Request Headers,确认你用来传递令牌的头(比如Authorization或者自定义的X-API-Key)是不是真的被发送出去了。
有时候部署后会遇到这些情况:
- 前端代码里的令牌变量因为环境差异变成了空值(比如本地依赖的环境变量没同步到虚拟主机)
- 某些前端打包工具或者缓存机制,导致AJAX配置没生效
举个jQuery AJAX的正确配置示例,你可以对比下自己的代码:
$.ajax({ url: 'https://alientechno.000webhostapp.com/step_muzic/v1/get_owner_main_page', type: 'GET', headers: { // 如果你用Bearer令牌 'Authorization': 'Bearer ' + yourAccessToken, // 或者自定义API Key头 // 'X-API-Key': yourApiKey }, success: function(res) { // 处理返回结果 }, error: function(xhr) { console.log('请求错误:', xhr.responseText); } });
2. 检查000webhost的服务器是否过滤了请求头
有些虚拟主机服务商默认会过滤掉一些请求头,或者对Authorization这类标准头有特殊处理,导致PHP代码读不到。
如果你的API是用$_SERVER['HTTP_AUTHORIZATION']读取令牌,试试改成读取$_SERVER['REDIRECT_HTTP_AUTHORIZATION']——部分服务器在重定向请求时,会把原请求头加上REDIRECT_前缀。
另外,也可以换用自定义请求头(比如X-API-Key),然后在PHP里用$_SERVER['HTTP_X_API_KEY']读取,这种自定义头通常不容易被过滤。
3. 排查是否存在跨域问题
虽然本地环境没问题,但部署后可能出现前端和API不同源的情况(比如前端在另一个子域名下),这时候浏览器会发送OPTIONS预检请求,如果API没配置CORS允许携带自定义头,浏览器就会拦截请求头。
在你的API PHP代码开头加上CORS配置试试:
// 允许指定前端域名,*是允许所有,建议上线后改成你的前端域名 header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); // 这里要包含你用来传令牌的请求头 header("Access-Control-Allow-Headers: Content-Type, Authorization, X-API-Key"); // 处理OPTIONS预检请求,直接返回200 if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit(); }
4. 临时输出服务器接收的所有请求头
你可以在API的PHP代码里临时加一段调试代码,看看服务器到底接收到了哪些请求头:
var_dump($_SERVER); exit;
然后用浏览器发送请求,查看返回的内容,确认你传递令牌的请求头是否存在。这样就能明确是请求没发对,还是服务器没收到。
内容的提问来源于stack exchange,提问作者shrish123 kumar

