12 9 6 3
just a phper
PHP的curl之CURLOPT_POSTREDIR

前言

故事得从google说起----
2017,google已经开始嫌弃http了,并“强制”要求使用https , 其实这也件好事。
虽然购买证书成本略高,但是免费的证书也有很多,
比如,Let's EncryptStartCOMWoSign and so on
但是呢,不知道为什么(应该是为了SSL证书销售利益),最近,StartCOM,WoSign 都被mozilla/google内核的浏览器封了,
我原来用的是startcom的免费证书,过完年来,升级google chrome 到56 ,发现本站点变成了“不安全”状态。手动表情【捂脸】
后来发现了,腾讯有提供免费证书,于是,申请了试试,申请很快就通过了,感觉还不错(前几年都是翻墙到国外申请,【捂脸】)


于是呢,想给另一个域名也申请证书,换上证书后,也把80端口强制跳转到443端口上,访问没问题。
但是,出现了另一个问题, 其他站点向该站点上报数据接口,以前都是走http协议
现在问题来了,80端口强制跳转导致数据上报失败。。。

解决方案

最初的想法 :

方法一:把http改成https
方法二:配置 CURLOPT_FOLLOWLOCATION

方法一,由于不用环境的目标不一定是https,但是不能统一改成https,若通过配置来决定是否https也略繁琐,失败告终,
方法二,加上 允许重定向配置之后, 跳转是没问题了, 但是跳转之后变成了get,而且post参数也没有了


针对方法二做改进,准备在目标服务器的 nginx 修改配置 ,让80的端口的上报接口uri不做强制跳转
处理如下:

        if ( $request_uri !~* "\/api\/api" ) {
                rewrite ^/(.*) https://domain.com/$1 permanent;
                break;
                }

这做法是可行的


方法三:

后来发现有另一个处理办法,不需要改nginx配置
配置CURLOPT_POSTREDIR即可
安装官方对该参数的说明是:

位掩码, 1 (301 永久重定向), 2 (302 Found) 和 4 (303 See Other) 设置 CURLOPT_FOLLOWLOCATION 时,什么情况下需要再次 HTTP POST 到重定向网址。

在7.0.7版本,已经把参数值改成了全局常量
CURLOPT_POSTREDIR

总结

遇到问题多思考,成长在于处理各种问题的经验积累。

php
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证