C++ POST请求PHP服务失效,求助禁用HTTP转HTTPS重定向
C++ WININET POST请求失效问题及HTTPS重定向禁用求助
问题背景
我用Visual Studio编译的C++程序,通过POST请求向PHP服务器提交数据,该功能正常运行多年后,2023年1月突然失效。可能的变更点:服务器升级到PHP 8,以及Windows更新导致程序依赖的WININET.DLL发生变化。
程序代码
HINTERNET hSession = InternetOpen(“lpszAgent”, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); HINTERNET hConnect = InternetConnect(hSession, “server.XXX.com”, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); LPCSTR FAR* rgpszAcceptTypes = { _T("*/*"), NULL }; HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", “path_to_script.php”, NULL, NULL, rgpszAcceptTypes, 0, NULL); LPCSTR lpszHeaders = "Content-Type: application/x-www-form-urlencoded"; DWORD dwHeadersLength = strlen(lpszHeaders); LPCSTR pfrmdata = "a=b&etc";//已正确编码 DWORD dwOptionalLength = strlen(pfrmdata); bool ok = HttpSendRequest(hRequest, lpszHeaders, dwHeadersLength, (void*)pfrmdata, dwOptionalLength);
服务器端接收情况
程序无报错,但服务器收到空POST请求,请求头信息如下:
SERVER: array ( 'LSPHP_ENABLE_USER_INI' => 'on', 'PATH' => '/usr/local/bin:/usr/bin:/bin', 'TEMP' => '/tmp', 'TMP' => '/tmp', 'TMPDIR' => '/tmp', 'PWD' => '/', 'HTTP_ACCEPT' => '*/*', 'HTTP_CONNECTION' => 'Keep-Alive', 'CONTENT_LENGTH' => '0', 'HTTP_HOST' => ‘Correct ', 'HTTP_USER_AGENT' => 'Correct', 'HTTP_CACHE_CONTROL' => 'no-cache', 'REDIRECT_UNIQUE_ID' => 'Y82i1YUhgzjQfeXqYUTbfQAAAH8', 'REDIRECT_QS_SrvConn' => '70', 'REDIRECT_QS_AllConn' => '75', 'REDIRECT_QS_ConnectionId' => '167442094953986927446367', 'REDIRECT_HTTPS' => 'on', 'REDIRECT_SSL_TLS_SNI' => 'Correct', 'REDIRECT_STATUS' => '200', 'UNIQUE_ID' => 'Y82i1YUhgzjQfeXqYUTbfQAAAH8', 'QS_SrvConn' => '70', 'QS_AllConn' => '75', 'QS_ConnectionId' => '167442094953986927446367', 'HTTPS' => 'on', 'SSL_TLS_SNI' => 'Correct', 'SERVER_SIGNATURE' => '', 'SERVER_SOFTWARE' => 'Apache', 'SERVER_NAME' => 'Correct ', 'SERVER_ADDR' => 'Correct', 'SERVER_PORT' => '443', 'REMOTE_ADDR' => 'Correct', 'DOCUMENT_ROOT' => 'Correct', 'REQUEST_SCHEME' => 'https', 'CONTEXT_PREFIX' => '', 'CONTEXT_DOCUMENT_ROOT' => 'Correct', 'SERVER_ADMIN' => 'Correct', 'SCRIPT_FILENAME' => 'Correct', 'REMOTE_PORT' => '8700', 'REDIRECT_URL' => 'Correct', 'SERVER_PROTOCOL' => 'HTTP/1.1', 'REQUEST_METHOD' => 'GET', 'QUERY_STRING' => '', 'REQUEST_URI' => 'Correct', 'SCRIPT_NAME' => 'Correct', 'PHP_SELF' => 'Correct', 'REQUEST_TIME_FLOAT' => 1674420950.062037944793701171875, 'REQUEST_TIME' => 1674420950, 'argv' => array ( ), 'argc' => 0, )
核心异常点:
CONTENT_LENGTH为0CONTENT_TYPE缺失(应为application/x-www-form-urlencoded)REQUEST_METHOD变为GET而非POST
我清楚CONTENT_TYPE是POST数据被读取的必要条件,缺失会导致请求方法转为GET,数据被服务器忽略。
排查过程
- 降级PHP到7.4,无效;
- 将脚本迁移到其他PHP7.4服务器,可正常运行;
- 在该服务器新建PHP8.2站点,失效;降级到7.4仍失效;
- 新建站点直接用PHP7.4可运行,升级到8.2后失效,再降级回7.4依然失效。
更新:问题根源确认
确认问题是主机提供商Hostmonster强制将HTTP请求重定向到HTTPS,且对方拒绝提供关闭该功能的选项。现求助:如何通过本地.htaccess文件禁用该自动重定向?
解决方法
方法1:修改C++代码直接发起HTTPS请求(推荐)
既然服务器强制HTTPS,直接适配HTTPS比禁用重定向更可靠,还能提升传输安全性:
- 将
InternetConnect的端口改为INTERNET_DEFAULT_HTTPS_PORT(对应443端口); - 在
HttpOpenRequest的参数中添加INTERNET_FLAG_SECURE标记,启用HTTPS加密:
HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", “path_to_script.php”, NULL, NULL, rgpszAcceptTypes, INTERNET_FLAG_SECURE, NULL);
修改后直接走HTTPS协议,避免被重定向导致POST数据丢失。
方法2:尝试用.htaccess禁用重定向(仅部分场景有效)
如果必须坚持使用HTTP,可尝试在网站根目录的.htaccess中添加以下规则,尝试覆盖主机的全局重定向配置:
RewriteEngine On # 取消HTTPS强制重定向,将HTTPS请求转回HTTP RewriteCond %{HTTPS} on RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]
注意:部分主机商的全局配置优先级高于本地.htaccess,这种情况下该规则可能无法生效。如果无效,优先选择修改代码适配HTTPS。
内容的提问来源于stack exchange,提问作者VS Projects
相关产品推荐
相关产品推荐

