PHP:CURL无法保存cookie

PHP:CURL无法保存cookie,php,curl,cookies,php-curl,Php,Curl,Cookies,Php Curl,我从一台主机使用PHP连接到同一子网上另一台主机的API,这需要cookies来记住登录名。它给了我一个警告:未能在/var/includes/cookie中保存cookie。 我为自己设置了一个简短的测试脚本,如下所示: $handle=curl_init(); $logfile=fopen('php://temp","w+",; curl_setopt_数组($handle,数组( CURLOPT_URL=>'https://10.0.0.10:8443/api/login', CURLOP

我从一台主机使用PHP连接到同一子网上另一台主机的API,这需要cookies来记住登录名。它给了我一个
警告:未能在/var/includes/cookie
中保存cookie。 我为自己设置了一个简短的测试脚本,如下所示:

$handle=curl_init();
$logfile=fopen('php://temp","w+",;
curl_setopt_数组($handle,数组(
CURLOPT_URL=>'https://10.0.0.10:8443/api/login',
CURLOPT_RETURNTRANSFER=>true,
CURLOPT_COOKIEJAR=>'/var/includes/cookie',
CURLOPT_COOKIEFILE=>'/var/includes/cookie',
CURLOPT_SSL_VERIFYPEER=>false,
CURLOPT_SSL_VERIFYHOST=>false,
CURLOPT_VERBOSE=>true,
CURLOPT_STDERR=>$logfile,
CURLOPT_POST=>true,
CURLOPT_POSTFIELDS=>json_编码(数组('username'=>'user','password'=>'pass'))
));
$output=curl\u exec($handle);
卷曲关闭($handle);//饼干应该保存在这里,对吗?
//从curl详细日志文件获取内容
倒带($logfile);
$log=流\u获取\u内容($logfile);
fclose($logfile);
错误日志($log);
错误日志(打印($output,true));
详细日志文件提供以下输出:

*DNS缓存中的主机名已过时,已被清除
*正在尝试10.0.0.10。。。
*TCP_节点集
*连接到10.0.0.10(10.0.0.10)端口8443(#0)
*ALPN,提供http/1.1
*已成功设置证书验证位置:
*CAfile:/etc/pki/tls/certs/ca-bundle.crt
卡帕斯:没有
*使用TLSv1.2/ECDHE-RSA-AES128-GCM-SHA256的SSL连接
*ALPN,服务器不同意协议
*服务器证书:
*主题:CN=api.example.com
*开始日期:10月5日07:07:04格林威治标准时间2020
*到期日期:1月3日07:07:04 2021 GMT
*发行人:C=美国;O=让我们加密;CN=让我们加密授权X3
*SSL证书验证正常。
>POST/api/login HTTP/1.1
主持人:10.0.0.10:8443
接受:*/*
内容长度:42
内容类型:application/x-www-form-urlencoded
*上传已完全发送:42个字节中的42个
$output
本身的内容正确;它从API给我一个OK信号,表示登录成功。但是,后续请求会向我发出未登录的信号,这肯定是因为未保存cookie,因此未读取cookie

我试过:

  • 为cookie使用服务web目录中的路径
  • touch/var/includes/cookie
    并将所有者和组设置为具有读/写权限的apache
  • 对文件设置777权限
  • sudo-u apache bash
    获取一个终端并尝试修改文件-这是可行的,那么文件权限肯定可以吗
有什么指示我应该去哪里看吗?SELinux会影响这一点吗?我的问题看起来很相似

CentOS 8、PHP7.2.11、libcurl 7.61.1,结果是SELinux在尝试。在问题中提到解决方案有点傻,但我知道我不是第一个被SELinux绊倒的人

首先,要测试这是否真的是问题,您可以暂时将其关闭(如果这样做对您来说是安全的)

如果这样做行得通,我当然会建议重新打开它,并为需要修改的文件设置规则

setenforce 1
由于我的文件位于
/var/includes/cookie
,因此我将运行以下命令来添加持久性规则:

semanage fcontext-a-t httpd\u sys\u rw\u content\u t/var/includes/cookie
  • -a
    添加记录
  • -t
    指定了一个新类型,在本例中为可由httpd写入的类型
编写该上下文规则后,仍需应用该规则:

restorecon-v/var/includes/cookie
  • -v
    以获取有关更改内容的一些输出
有关更深入的描述,请参阅


同样值得注意的是:我必须安装
policycoreutils-python-utils
软件包才能在我最小的CentOS系统上获得
semanage
命令。

您是否尝试过使用脚本所在目录中的文件,正如您在回答其他问题时所建议的那样?@CBroe是的。我想我没有澄清,但是测试脚本位于web服务器的文档根目录下。如果从同一脚本实例中检查
is\u file
is\u writable
,您在这两种情况下都得到了正确答案吗?
is\u file
是正确的,但是
is\u writable
是错误的。尽管cookie文件由web服务器用户apache(在Linux中)拥有并可写,但至少它是有意义的。
setenforce 1