NodeJS Express获取PHP请求源域名时origin为undefined如何解决
问题根因
Origin 是浏览器在跨域场景下自动注入的请求头,服务端通过cURL发起的请求默认不会自动携带该头,因此Express中读取origin返回undefined属于正常表现,并非Node服务配置错误。
另外你当前代码中打印的req.get('host')返回值是当前Node服务自身的域名,和请求发起方无关,无法用来获取来源地址。
可行解决方法
方案1:PHP端主动添加Origin请求头
在cURL配置中新增请求头配置,手动注入目标Origin值即可,修改后的PHP代码如下:
$curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://myNodedomain.com/sendAlert', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HEADER => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array('token' => '3242342332'), // 手动添加Origin头 CURLOPT_HTTPHEADER => array( 'Origin: https://domain1.com' ), )); $response = curl_exec($curl); curl_close($curl); echo $response;
配置完成后Node端即可通过req.get('origin')正常读取到https://domain1.com。
方案2:自定义请求头传递来源标识
如果不想使用标准Origin头,也可以双方约定自定义请求头传递来源,比如PHP端添加X-Request-Source: domain1头,Node端直接通过req.get('X-Request-Source')读取即可,这种方式不会和浏览器CORS规则产生冲突,灵活性更高。
注意事项
服务端之间的请求头可任意伪造,若你需要做来源合法性校验,不能仅靠请求头判断,建议搭配签名校验机制:双方约定专属密钥,PHP端发起请求时对参数加签,Node端接收请求后验签,通过后才认定来源合法,避免恶意伪造请求。
内容的提问来源于stack exchange,提问作者Alejandro
相关产品推荐
相关产品推荐

