🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
IIS

IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

2284閲覧

IIS 環境下でPHPのPOST送信時に特定の文字数以上になると受け渡しデータの文字数(長さ)が変わる

waiya

総合スコア11

IIS

IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2021/01/28 01:48

環境

IIS 10.0
PHP 5.6.9
確認ブラウザ:Edge

>PHP設定
max_input_vars:1000
post_max_size:1000M
memory_limit:128M
upload_max_filesize:1000M
output_buffering:4096

問題

IISの環境下にてフォーム送信を行っているのですが、テキストエリアに入力し受け渡し先へPOST送信した際に特定文字数以上になるとテキストの長さが変わり、文字列を入力値そのまま取得できません。

制限がかかるのはUTF8文字列で1819文字以上(5457バイト以上)のときに送信先にて913文字ほど(一部文字化け)になるといった形になっております。

1820文字 → 913文字に減少 + 一部文字化け
5000文字 → 910文字に減少 + 一部文字化け
10000文字 → 1808文字に減少

試したこと

web.configの設定で以下の設定値を変更・追加などしてみましたが変わらずでした。

>httpRuntime
maxRequestLength

>requestLimits
maxAllowedContentLength

>basicHttpBinding
maxReceivedMessageSize
maxStringContentLength
maxBytesPerRead

>管理者様に以下を変更してもらう
uploadReadAheadSize

少しでもヒントになるような情報をお持ちの方おられましたら、お教えいただければありがたいです。何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

68user

2021/01/28 02:54 編集

全くさっぱりわかりませんけど、ブラウザが正しいデータを送っている確認はとれていますか? 例えばブラウザを変えてみるとか (または curl コマンド使うとか)、IIS のログでリクエストのサイズを確認するとか、
m.ts10806

2021/01/28 03:20

WebサーバがIIS以外だとどうなるのでしょう
waiya

2021/01/28 03:41 編集

@68userさん 早速のご回答ありがとうございます。 はい、ブラウザをChrome / Firefoxでも試してみましたが、結果は同じになりました。 ブラウザのデベロッパーツールなどで確認し、リクエストヘッダーのcontent-lengthの長さをみるとレスポンスヘッダーのcontent-lengthより長いことを確認しておりまして、正常にリクエストを送っている様にみえております。 IISのHTTPログでは該当のPOST時に200ステータスを返していただいており、その際の容量ですでにバイト数が減少している形になっております。
waiya

2021/01/28 03:45

@m.ts10806さん ご連絡ありがとうございます。 WebサーバがIIS以外の場合は正常に送信できることを確認しています。 PHPの設定もIISでの設定値以下の状態で正常に全文送信されておりました。 ※nginxで同じ送信プログラムファイルで確認しました。
m.ts10806

2021/01/28 03:50

Edge以外だとどうですか? なんか、以前同じような質問を見た記憶があるので、過去質問も探してみてください
68user

2021/01/28 03:54

再現性のある HTML+Javascript (動的生成して POST するようなもの) と、POST の長さを表示する PHP ソースと、その結果が欲しいところですが、そこは絶対間違いないということであればわからないですねぇ (ちゃんと検証しておられるようですし)。 果たして切り分けになるかどうかもよくわかりませんが、ASP.NET で試してみるとか?
waiya

2021/01/28 05:08

@m.ts10806 ご連絡ありがとうございます。 Edge以外のChromeやFirefoxでも同様でした。 過去の質問も確認してみます。
waiya

2021/01/28 05:15

@68user お返事ありがとうございます。 再現性のあるコードですが、元々はWordPress上の送信がうまくいかず、プレーンなPHPのみの1つだけテキストエリアがあるコードで検証を行いましたところそちらでも事象が起こってしまったので、そもそも通信の問題かなとまではあたりをつけているところなのですが、 確認のコードは以下のようなものです。 ``` <?php //var_dump($_POST); $data = file_get_contents('php://input'); if($data){ $data = explode('=',$data); var_dump(urldecode($data[1])); } ?> <html> <head> <title>POSTテスト</title> </head> <body> <form action="?" method="post"> <textarea name="text"></textarea> <input type="submit" value="送信"> </form> </body> </html> ``` なにか問題がありそうな箇所ございましたらご指摘いただきますとありがたいです。
68user

2021/01/28 05:21

これ、data の値に "=" が入っていると短くなりません? > action="?" 関係ないような気もしますが、action="<?= $_SERVER['PHP_SELF'] ?>" などと普通に書くとどうなりますか?
waiya

2021/01/28 09:06

@68user お返事ありがとうございます。 >これ、data の値に "=" が入っていると短くなりません? POSTの生データで取得しておりますので「data」の値はURLエンコードされた状態で送信されますので 「=」で分割されることはありません。実際に「=」を含めた場合でもテキストエリアの値には「=」が含まれた状態で出力されましたので、それは問題ないかと思います。 >関係ないような気もしますが、action="<?= $_SERVER['PHP_SELF'] ?>" などと普通に書くとどうなりますか? 念の為書き換えて送信してみましたが、結果は同じでした。 IISの環境構成を再度確認しつつ、見てみたいと思います。
退会済みユーザー

退会済みユーザー

2021/01/29 06:47

Fiddler を使ってブラウザから送信されているフォームデータの内容を見るとかはしているのでしょうか? サーバー側の問題というのは考えにくいのですが・・・
waiya

2021/01/29 23:39

@SurferOnWww ご連絡ありがとうございます。お返事おそくなりました。 その後、他の方にもご教示いただきつつ進めたところ、テストする際にformのenctypeをmultipart/form-dataにすると正常に送信されたことが確認できたため、パケットの一部損失が発生している可能性があるのではないかとご指摘いただきました。 お恥ずかしながら、Fiddlerや、そちらを調べていく内に出てきました、Wiresharkなどのアプリケーションをはじめて知り、こちらの使い方も試しながら、http通信でのフォームデータの内容を確認してみたいと思います。
退会済みユーザー

退会済みユーザー

2021/01/30 00:50 編集

> テストする際にformのenctypeをmultipart/form-dataにすると正常に送信されたことが確認できたため、パケットの一部損失が発生している可能性があるのではないかとご指摘いただきました。 途中で一部消失するなんてことは、プロキシとかが途中にあってそこで何かしているというようなことがない限り、あり得ません。 一番疑わしいのは、ブラウザに送信された PHP の html, javascript が何かしているとか、multipart 形式でないと送れない何か(ファイル?)を送信しているとかだと思いますが(要するにクライアント側の問題に過ぎないのではと思いますが)、そのあたりはちゃんと調べたのですか?
waiya

2021/02/01 01:32

@SurferOnWww ご連絡ありがとうございます。 申し訳ありません。大前提のお話で環境の内容が抜け落ちておりました。 社に設置されたWindows Serverに外部からリモートで接続しており、そのサーバ内のブラウザでサーバ内のIIS環境へ接続して確認している状態でした。 テストの検証コードについてはコメントの過去投稿したコードのみかかれたファイルで検証しておりまして、ファイルのアップロード・Javascriptの使用をしていない状態でも事象が再現されました。 またブラウザも接続先サーバのブラウザ数種(Edge/Firefox/Chrome/IE)で検証し、すべてのブラウザで再現されましたので、各個のブラウザ、およびhtml/javascript/phpの問題ではないのではないかと判断しております。 今回、その環境の権限へのアプリケーションのインストールなどをできる権限ではありませんでしたので、一旦multipart/form-dataの実装を該当部分で行い確認いただくことにいたしました。 これで、一旦は解決済みにさせていただきたいと思います。 また、根本の原因は管理者様と確認していく予定にしておりますので、こちらも分かり次第ご報告できればと思っております。
guest

回答1

0

自己解決

enctypeにmultipart/form-data を追加することによりフォームデータの送信を正常に行うことが確認できましたので、一旦こちらで解決とさせていただきたいと思います。

ただし根本的なデータ通信の問題の解決にはなっていないと思いますので、経過をみてご報告できればと思います。
ご回答いただき誠にありがとうございました。

投稿2021/02/01 01:39

waiya

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問