java.lang.IllegalArgumentException:メソッド名に無効な文字が見つかりました。HTTPメソッド名はトークンでなければなりません


161

アプリケーションをマルチサーバーのApache Tomcat 8環境にデプロイすると、スタックトレースを下回ります。私はこのエラーを頻繁に受け取り、tomcatスレッドをブロックしているようです:

INFO [http-nio-80-exec-4461] org.apache.coyote.http11.AbstractHttp11Processor.process Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
 java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens
 at org.apache.coyote.http11.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:233)
 at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1017)
 at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684)
 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1524)
 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1480)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
 at java.lang.Thread.run(Unknown Source)

誰でも私にそのような例外のトラブルシューティングまたは絞り込み方法を指示できますか?アプリケーションソースファイルへの参照がありません。私はグーグルで回ろうとしました、そしてそれが言ったリンクの中で、あなたはhttpsを通してhttp urlにアクセスしようとしています、それはありそうにありません。アプリケーションが単一のTomcat 8インスタンスで実行されている場合、このエラーは発生しません。マルチサーバー環境でのみこれを取得します。

原因の特定に役立つ場合は、各ページに埋め込んだメタタグも共有しています。

<%
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Cache-Control", "no-store");
    response.setDateHeader("Expires", 0);
    response.setHeader("Pragma", "no-cache");
%>


<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0">
<meta name="viewport" content="width=device-width, initial-scale=1">

私はいくつかのページで以下のものも使用していますが、基本的には上記と同じです。

<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Expires" content="-1" />
<meta http-equiv="Cache-Control" content="private" />
<meta http-equiv="Cache-Control" content="no-store" />
<meta http-equiv="Pragma" content="no-cache" />

誰かが私のトラブルシューティングの試みを指示するのを手伝ってくれたとしても、それは役に立ちます。現在のところ、どこを見ればよいのかわかりません。

前もって感謝します。

回答:


266

この例外は、HTTPSが有効になっていないエンドポイントのクライアントからHTTPS要求を実行しようとしたときに発生する可能性があります。サーバーが生データを予期している場合、クライアントは要求データを暗号化します。


1
私はこの答えを理解しているのかわかりません。Spring Boot 1.5.1アプリを使用していて、ログにこの例外が表示されました。私のアプリは、ポート8443(ポート443からリダイレクト)でSSLに対してのみ応答し、SSL用のコネクタを1つだけ持っています。ポート443で、誰かがhttps:ではなくhttp:を試すことができると言っていますか?
ジムアーチャー

5
このような例外は、サーバーが期待するものと取得するものの間に不一致がある場合に発生します。あなたが言ったことは、考えられるシナリオの1つです。サーバー上にhttpsで実行されていないエンドポイントがあるかもしれませんが、誰かがこの方法でそれにアクセスしようとしていますか?
Petar Tonev 2017年

1
こんにちはピーター...問題は、誰かがポート80をポート8443に転送するためのIPテーブルルールを作成したため、ポート80でhttpを使用してサイトにアクセスした人がそのエラーを引き起こしたことです。Tomcatコネクタを追加して、ポート8080を8443にリダイレクトし、ポート80をポート8080に転送するようにIPテーブルルールを設定しましたが、問題はほとんどなくなりました。お返事ありがとうございます!
ジムアーチャー

1
@PeterTonev:(httpsをhttpにリダイレクトする|| httpsを無効にする||エラーをキャッチして、少なくとも意味のあるエラーメッセージを表示する)方法はありますか?
crusy

1
例外処理のために、ここであなたを助けるかもしれ@crusy何かがあるリンク
ペタルTonev

56

ローカルでテストしたときにも同じ例外が発生しました。問題は私のリクエストのURLスキーマでした。

変化する https:// to http:// in your client url.

おそらくそれは役に立ちます。


2
確かに機能しますが、HTTP経由の通信は安全ではないことに注意してください。
Paramvir Singh Karwal

23

ローカルサーバーをhttp:// localhost:8080 / foo / barで呼び出しています。https:// localhost:8080 / foo / barで呼び出します。これは問題を解決します


おそらく8080にhttps://はありません。コールをhttps:// localhost:8443 / foo / barに変更します-これがリンクの例です– Rodrigo R. Coelho
Rodrigo R. Coelho

9

誰かがswaggerを使用している場合:

実行にヒットする前に、必要に応じてスキームをHTTPまたはに変更HTTPSします。

郵便配達:

URLパスをURLアドレスに、http://またはhttps://URLアドレス内で変更します


8

TLSの問題とは無関係のこの例外を受け取りました。私の場合、Content-Lengthヘッダー値が本文の長さと一致しませんでした。


2
感謝しきれません。他のすべてのPOST要求はエラー400で失敗し、髪を切り取る準備ができていました。content-lengthヘッダーを送信しないことがこの問題を解決することが判明しました。
Alexander

2
ローカル開発者へのPostmanリクエストに対して30〜90秒の遅延が発生していました。Content-Lengthヘッダーを無効にすると、遅延が修正されました。
アロク

1

この古い質問に答える(役立つかもしれない他の人のために)

httpd confを正しく設定すると、問題が解決します。httpdサーバーがない場合は、インストールします。

ここに私の設定をリストします。

[smilyface@box002 ~]$ cat /etc/httpd/conf/httpd.conf | grep shirts | grep -v "#"


        ProxyPass /shirts-service http://local.box002.com:16743/shirts-service
        ProxyPassReverse /shirts-service http://local.box002.com:16743/shirts-service
        ProxyPass /shirts http://local.box002.com:16443/shirts
        ProxyPassReverse /shirts http://local.box002.com:16443/shirts
        ...
        ...
        ...

上記のようにファイルを編集し、以下のようにhttpdを再起動します

[smilyface@box002 ~]$ sudo service httpd restart


そして、with withリクエストはhttps例外なく機能します。
と一緒httpにリクエストも転送しhttpsます!心配ない。


1

私はクロムブラウザで2つのことをすることによってこのエラーを解決しました:

  1. Ctrl + Shift + Deleteを押して、すべての閲覧データを最初からクリアしました。
  2. Chromeの[設定]-> [詳細設定]-> [プロキシ設定を開く]-> [インターネットのプロパティ]に移動し、[コンテンツ]ウィンドウに移動して、[SSL状態のクリア]ボタンをクリックします。

このサイトには、この情報とその他のオプションもあります。https//www.thesslstore.com/blog/fix-err-ssl-protocol-error/


1

私はこれが古いスレッドであることを知っていますが、これが起こる特定のケースがあります:

VPCリンクと組み合わせたAWS APIゲートウェイを使用していて、ネットワークロードバランサーでプロキシプロトコルv2が有効になっている場合、400 Bad Requestも発生します。

それを理解するために午後中ずっとかかったので、それが誰かを助けるかもしれないなら私はうれしいです:)


0

同じ例外が発生し、ページが読み込まれるたびに、

NFO: Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens
    at org.apache.coyote.http11.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:139)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1028)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

ページのURLの1つがhttpではなくhttpsであることがわかりました。同じものを変更すると、エラーが発生しなくなりました。


0

これは通常、アプリがデプロイされているサーバーでサポートされていないURIスキームを使用している場合に発生します。したがって、サーバーがサポートするすべてのスキームを確認してURI、それに応じて要求を変更するか、サーバーにそのスキームのサポートを追加することができます。アプリケーションのスコープは、これを決定するのに役立つはずです。


0

sshトンネルSOCKSで同じポートを使用して8080ポートでプロキシを実行していて、サーバーと私のFirefoxブラウザプロキシがそのポートに設定されていると、この問題が発生しました。


0

私の場合、このエラーを取り除くために、ブラウザーの履歴/ Cookieをクリアする必要がありました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.