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; ?>