我想通过 RewriteRule 向 api 文件发送 post 请求。这是我的 .htaccess:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^api/(.*).php$ api/request_data.php?url=$1 [L,QSA]
request_data.php 是 /api 中唯一存在的文件。所有其他文件请求都将发送到具有此文件名(不带扩展名)作为 $_GET 参数的文件。
当我使用 HTML 表单进行测试时,效果很好,如下所示:
<form action="/api/get_test_data.php" method="post" target="_blank">
<input type="hidden" name="test" value="ABCDEF1234567890" />
<input type="submit" value="Submit">
</form>
这将在 request_data.php 中给我:
$_GET = Array
(
[url] => sign_in2
)
$_POST = Array
(
[test] => ABCDEF1234567890
)
但是,当我通过curl执行相同操作时,它只给我request_data.php中的$_GET参数,$_POST为空。
这些是我的卷曲选项:
$curl = curl_init();
curl_setopt_array(
$curl,
array(
CURLOPT_URL => "/api/get_test_data.php",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 1,
CURLOPT_TIMEOUT => 3,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => ["test: ABCDEF1234567890"]
)
);
$response = curl_exec($curl);
使用curl时重写时$_POST数据是否可能会丢失,但在通常的HTML表单中不会丢失?
我找到了解决问题的方法。
我可以通过getallheaders获取$_POST数据。只需要清理不必要的信息,但我可以忍受。