You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 为0
  • CONTENT_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:05:18