[php js]POST時、php ://inputの値が空文字になる

phpに対してjsのfetch apiを使って、jsonを送信しようとした時にはまったのでメモ。どうしたらいいかは状況次第です。

原因

まず、php側のコードは以下。

  $test = file_get_contents('php://input');

jsからjsonを送る時には’Content-Type’:’application/json’を設定するかと思いますが、上記を設定すると、php側は$_POSTで取得することができなくなります。

そしてなぜかphp側では空だったのですが、色々と調べてみると。、。。

file_get_contents('php://input') always returns an empty string
I'm building a PHP RESTful API, following this tutorial. The following function, which should return the data sent with the request when the 'put' method is use...

こちらのページを発見。要約すると、どうもリダイレクトした時点でphp ://inputの中身は空になってしまうそうです。。

また、$_POSTの値も無くなってしまうそう。。

.htaccessでwww有無やhttpとhttpsを統一していると発生する様子。あとはフレームワークでありがちなindex.phpにアクセスさせてそこから各リソースに飛ばすタイプのやつ。困っている方はリダイレクトしていないか見直してみてください。

詳しい解説

リダイレクトする時にはステータスコードが301か302を使うというのが定石かと思います。しかしこの2つのステータスコード、GET以外のHTTPメソッドもGETにしてしまうことが可能なのです。
そして現在全てGETになってしまうのがデファクトスタンダードな状態。

じゃあなぜ困ってない人が多いの?と思われるでしょうが、PHPを使って複雑なシステムを開発する際にはLaravelやWordPressといったフレームワークを使う方がほとんどではないでしょうか。これらフレームワークではリクエストポイントで独自の変数にリクエスト情報を保持しておき、リクエストに応じた画面で呼び出しているので問題ないのです。

じゃあネイティブPHPで「www有り無し統一」や「index.html有り無し統一」をしながらJSONを扱うにはどうどうば良いのでしょう?

実は2014年ごろに、ステータスコード307と308が提唱されました。これは301や302とほぼ一緒なのですが、唯一違うところは「HTTPメソッドをリダイレクト先にも継承することが義務付けられる」という部分です。

対策

Apacheでの対策は、.htaccessでのRewriteRuleで[R=308]のように明示することです。
ただ気をつけなければならないのが、Apacheでは古いバージョンだと308に対応していないので500エラーが発生してしまうこと。

こちらで確認できたのは、Apache2.2系だと307はOKでしたが308は不可能でした。
2.2系のサポートは2017年に切れているので、クラウドサービスやレンタルサーバでは問題ないでしょうが、開発環境をアップデートしていないと発生する可能性はあります。

申し訳ありませんがNginexは詳しくないので調べてません。

レンタルサーバはConohaWINGが最強にオススメ!

muchilogでは今までいろんなレンタルサーバやSaaSを使ってきましたが、今では全てをConohaWINGにて運営しています。

■今まで使ってきたサービス一覧
・さくらレンタルサーバ(ベーシックプラン)
・カゴヤ
・Azure
・AWS

今ではこのブログは勿論、webサービスのバックエンドやアプリのサーバ機能もConohaWINGで動かしています。
そんなConohaWINGのメリットをいくつか紹介します!

【国内最速No.1】高性能レンタルサーバーConoHa WING

無料で最大2個の独自ドメインが使える!

サイト運営に必要な独自ドメインをなんと無料で取得することが可能です!これだけでも月100円以上は運営費が節約できます。

優れた速度と安定感

私がAzureやさくらを解約した大きな理由はこれ。Conohaは非常に安定して稼働しており、ダウンタイムがほぼ発生しません。発生した場合は潔くお知らせしてくれます。
また、このブログは勿論、バックエンドとして動いてるプログラムも処理速度が大幅に向上しました(体感で倍速以上)。 Azure等のSaaSからレンタルサーバに移行するって普通考えられませんよね?しかし実際に大きなメリットを感じているのです。

頻繁に開催されるキャンペーン

ConohaWINGは半額に迫るようなキャンペーンを頻繁に開催しています。このキャンペーンによって、性能的には業界トップクラスであるにも関わらず、 月額料金換算で最安値クラスで使えるのです。
基本的に長期一括契約の方がお得になるため、muchilogでは最長で契約することをオススメします。価格と性能のバランスを考えれば他に乗り換えることも考えれられませんし。

レンタルサーバは必須です!

web系のプログラミング学習を進める際には、レンタルサーバの契約は必須と思ってください。ローカルの環境と本番環境で動作が違うことは良くありますし、ポートフォリオを公開するのも大切です。

学習や制作に集中するためにも、満足度、速度、安定度全てのレベルが高いConohaWINGを最強にオススメします!

web系サービス開発会社に転職したい!

muchilogではIT系へ転職したいという方には「自社サービスを運営しているweb系企業」への転職をおすすめしています。

web系は「自由な社風」「成長できる環境」「ホワイトな労働条件」であることが多いからです。

そんなweb系企業への転職を確実にするためのプログラミングスクールが登場しました。


RUNTEQ

RUNTEQはただのスクールじゃない!

RUNTEQはweb系の開発会社。開発会社が運営するスクールなので必要とされる技術力は勿論習得可能。しかしそれだけではないのです。

特にweb系で転職・就職活動を行う際にはポートフォリオを求められることがあります。ポートフォリオとは自分自身の作品のことで、技術力や企画力を示すものです。

RUNTEQではポートフォリオの作成を企画段階からサポートしてくれます!

他のプログラミングスクールでは提携企業の派遣やアルバイトとして就職するしかなかったりもしますが、RUNTEQはあなたの市場価値を高める方法まで教えてくれるということですね。

また、RUNTEQが扱う教材はどれも第一線で当たり前に使われている技術。特に未経験者の独学ではどうしてもスキルセットに穴が出来てしまいます。その点RUNTEQは確実に現場力を養えます。

そして2020年2月〜2021年12月までの内定者の98%がweb系企業に内定しています。これはRUNTEQの指導力とサポートが優れていることの証拠でしょう。

まずは無料説明会に申し込んではいかがでしょうか?

RUNTEQ


PHP
muchiをフォローする
MUCHILOG
タイトルとURLをコピーしました