5

DOMにタグを作成することでRailsアプリと通信するJavaScriptウィジェットがあります。時々、サーバーログに不正な形式のリクエストが表示されます。URLは255文字で切り捨てられます。

http://myapplication.example/mycontroller/1/myaction?hostname=www.mycustomer.example&request[param_a]=3&request[param_b]=1&request[param_c]=0&request[param_d]=0&request[param_e]=3&request[param_f]=1&request[param_g]=4&request[param_h]=0&request[param_i]=5&request

GoogleとStackoverflow(さまざまなブラウザでのURLの最大長はどれくらいですか?)から、255文字はURLの有効な制限ではないようです。

これが私が知っていることです:

  • これは散発的な問題であり、すべてのリクエストで発生するわけではありません
  • これが発生すると、URLは255文字で切り捨てられます
  • このエラーが発生すると、ユーザーエージェントはバックトレースに記録されません

これが私が知らないことです:

  • このエラーはどのタイプのブラウザで発生しますか?おそらくいくつかのモバイルブラウザ...

この問題を引き起こす根を張る最良の方法は何ですか?

4

3 に答える 3

3

根本原因を解決する最善の方法は、それをGETではなくPOSTリクエストにすることです。

AFAIKにはQueryStringの長さに制限が設定されていないため、実際の制限はいたるところにあります。一部のWebサーバーでは4000が制限であることは知っていますが(IISかApacheか、変更できるかどうかは思い出せません)、一部のブラウザーの制限ははるかに小さい可能性があります。ユーザーエージェントを取得しないという事実は、それが実際のブラウザーではなく、モバイルブラウザー、クローラー、またはその他のアプリケーションであることを強調する可能性があります。

POSTリクエストの実行は少し複雑ですが、はるかに大きな「ペイロード」を運ぶことができ、サーバー側で構成できます。

于 2010-03-04T18:44:59.803 に答える
2

なぜそれが起こっているのかわかりません、RFC2068は次のように述べています:

一部の古いクライアントまたはプロキシの実装ではこれらの長さが適切にサポートされていない可能性があるため、サーバーは、255バイトを超えるURIの長さに依存することに注意する必要があります。

サーバーが長いGETパラメータを誤って処理している可能性があります。または、サーバーによる要求の失敗を回避するために、古いブラウザ(IE6など)がパラメータを送信する前に切り捨てている可能性があります。

ただし、(私が知っている)どのブラウザーまたはサーバーでもPOSTリクエストの長さに制限はないため、これは確実に機能するソリューションである可能性があります。

編集: このリンクは、特定のブラウザがクエリ文字列の長さに制限を課していることを示していますが、それらはすべてかなり長いようです。おそらくモバイルブラウザは、メモリの量が限られているため、メモリを節約するために長さを最大255に制限しています。

于 2010-03-04T18:46:24.647 に答える
0

アクセスログでこれが発生するのを確認しました。切り捨てられた要求を生成する非常に特殊なIPがいくつかあります。これらのIPからのすべてのトラフィックを見ると、ユーザーエージェント文字列を持つ切り捨てられていない要求もあることがわかります。それらのいくつかには複数のユーザーエージェント文字列があります(ただし、Safari 5.0.5 /Mac10.6.8とIE9.0/ NT 6.1の2つ以上の一意の文字列は表示されていません)。また、2つのケースを除くすべてのケースで、約50ミリ秒後に、良いリクエストの後に悪いリクエストが表示されます。この場合、悪いリクエストは良いリクエストと同じですが、255バイトで切り捨てられます。残りの2つのケースでは、良いリクエストの前に悪いリクエストがあります。IPの1つはAT&T Worldnetからのものであり、モバイルゲートウェイである可能性があることを示唆していますが、他のIPは、ISP、大学、または企業のように見えました。

これから何がわかるのかまだわかりません。Safari5とIE9が同じIPから表示される可能性はほとんどありません。3つの可能性はMacOSX上のWindowsVMであり、IPはゲートウェイであり、2人の異なるユーザーがそれを介して要求を行ったか、誰かが私をいじっています。ゲートウェイを介してアクセスするユーザーが2人だけであり、この特定のサイトの訪問者の人口統計がVMを実行している可能性は低いですが(不可能ではありませんが)、少なくともこの特定のタスクでは、ちょっと奇妙に思えます。

切り捨てられたリクエストが切り捨てられていないリクエストの直後に続くという事実は、おそらく何かを示唆していますが、それが何であるかはわかりません。リクエストを再生するプラグインでしょうか、それともリクエストを再生するNATでしょうか?透過プロキシ?

于 2012-04-03T15:44:21.857 に答える