首页 > 解决方案 > 如何接收自定义标头并在卷曲中发送它的值?

问题描述

我们正面临一个奇怪的错误,我们不确定为什么会发生这种情况。

有一个 js 客户端正在运行,需要向 PHP 服务器发出请求。该服务器需要从远程位置获取数据,然后将其返回给 js 客户端。每台服务器都在不同的域中,我们已经配置了跨域标头。

 Header set Access-Control-Allow-Origin "*"
 Header set Access-Control-Expose-Headers "X-Session-Token, x-session-token"
 Header set Access-Control-Allow-Headers "X-Session-Token, x-session-token, Content-Type, content-type" 

我们必须x-session-token从 JS 接收自定义标头,并将其作为标头转发到远程位置。请参阅下面的代码。a出于说明目的,我们添加b了自定义标题。

 function generateCheckoutURL() {
    $protocol = (isset($_SERVER['HTTPS']) ? 'https' : 'http');
    $permalinkString = $protocol . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];


    $headers = getallheaders();     
    $xSessionToken = "a " . $headers["X-Session-Token"] . " b";
    // echo $headers['X-Session-Token'];exit(); //

    $nonce = UtilsStatic::createNonceWithBodyData();
    $curl = curl_init($this->apiURL . 'checkout?permalink=' . $permalinkString . '&nonce=2');

    $requestHeaders = [
      'Content-Type: application/json',
      'Authorization: ' . $this->apiAuth,
      'X-Session-Token: ' . $xSessionToken


    ];

    // print_r($requestHeaders);exit();

    // curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    // curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    // curl_setopt($curl, CURLOPT_HEADER, true);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $requestHeaders);
    curl_setopt($curl, CURLOPT_POST, 1);    
    // curl_setopt($curl, CURLOPT_POSTFIELDS, $bodyData);

    $checkout = json_decode(curl_exec($curl));

    $info = curl_getinfo($curl);

    $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);

    http_response_code($httpcode);

    return $checkout;
  }

这是来自远程服务器的日志,显示接收到的值。它没有收到应该具有自定义标头的字符串部分。

CheckoutResource - X-Session-Token [a  b]

现在真正奇怪的是,如果我们只是在那里设置一个字符串而不是从中加载自定义标题,getallheaders我们只是将它设置为一个特定的值,它会按预期工作。我也尝试使用其他自定义标头,并且无论标头名称如何,都会发生同样的问题。

如果重要的话,我们可以完全控制用于处理标头的远程服务器,并且 php 脚本由 apache 提供。

编辑

根据要求,来自getAllHeaders. 我可以打印标题并将其用作字符串,它只是没有在 curl 中发送。

Array
(
    [Host] => local.menus.com
    [Connection] => keep-alive
    [Content-Length] => 504
    [Pragma] => no-cache
    [Cache-Control] => no-cache
    [X-Session-Token] => o154fl5qt7ifqf67r3novits1q
    [User-Agent] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36
    [Content-type] => application/json
    [Accept] => */*
    [Origin] => http://localhost:8282
    [Referer] => http://localhost:8282/
    [Accept-Encoding] => gzip, deflate
    [Accept-Language] => en-US,en;q=0.9,pt-BR;q=0.8,pt;q=0.7
)

标签: phpcurlhttp-headers

解决方案


推荐阅读