Webhook等で受け取ったPOSTリクエストを処理する機能を作ったが、とある事情で直接POSTを受け取ることができない事象が発生した。
DNSのTTL消化までの時間や、SSLのバージョンによって今後も類似のケースが発生しそうなのでメモ。
ただ、明らかに好ましい手段ではないので、最終手段かつ一時的な対策とする。
尚、この記事のコードのままだと、POSTが無害化されてなくて非常に危険なので、一般公開されたサーバーでは利用しないでください。
| ステップ | 通常 | 今回 |
| 1 | origin.example.com | origin.example.com |
| 2 | receive.example.com | relay.example.com |
| 3 | receive.example.com | |
| originからreceiveに直接POSTすると失敗する。 | relayを中継して、originからのPOSTをそのままreciveに渡して、レスポンスを返す |
<?php
// POSTデータを受け取る
$data = array_map('htmlspecialchars', $_POST);
$options = array(
'http' => array(
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => http_build_query($data)
)
);
$context = stream_context_create($options);
// HTTPSリクエストを送信して結果を取得
$result = file_get_contents('https://example.com/path', false, $context);
// 結果を表示
echo $result;
?>