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)

ผู้ใดสามารถบอกวิธีแก้ปัญหาหรือ จำกัด การเว้นดังกล่าวได้หรือไม่ ฉันไม่ได้รับการอ้างอิงใด ๆ กับไฟล์ต้นฉบับของแอปพลิเคชันของฉัน ฉันพยายามใช้ google แล้วและจากลิงก์ที่กล่าวมาคุณกำลังพยายามเข้าถึง http url ผ่าน https ซึ่งดูเหมือนไม่น่าจะเกิดขึ้น ฉันไม่ได้รับข้อผิดพลาดนี้เมื่อแอปพลิเคชันทำงานบนอินสแตนซ์ 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" />

แม้ว่าใครก็ตามที่ช่วยในการชี้แนะแนวทางในการแก้ไขปัญหาของฉันก็จะมีประโยชน์อย่างที่ฉันไม่รู้ในปัจจุบัน

ขอบคุณล่วงหน้า.

คำตอบ:


267

ข้อยกเว้นนี้สามารถเกิดขึ้นได้เมื่อคุณพยายามเรียกใช้คำขอHTTPSจากลูกค้าที่ปลายทางซึ่งไม่ได้เปิดใช้งาน HTTPS ลูกค้าจะเข้ารหัสข้อมูลที่ร้องขอเมื่อเซิร์ฟเวอร์ต้องการข้อมูลดิบ


1
ฉันไม่แน่ใจว่าฉันเข้าใจคำตอบนี้หรือไม่ ฉันมีแอพ Spring Boot 1.5.1 และฉันเห็นข้อยกเว้นนี้ในบันทึกของฉัน แอพของฉันตอบเฉพาะ SSL บนพอร์ต 8443 (เปลี่ยนเส้นทางจากพอร์ต 443) และมีตัวเชื่อมต่อเดียวสำหรับ SSL คุณกำลังบอกว่ามีคนลองใช้ http: แทนที่จะเป็น https: ที่พอร์ต 443 หรือไม่
Jim Archer

5
ข้อยกเว้นดังกล่าวเกิดขึ้นเมื่อมีความไม่ตรงกันระหว่างสิ่งที่เซิร์ฟเวอร์คาดหวังกับสิ่งที่ได้รับ สิ่งที่คุณพูดเป็นหนึ่งในสถานการณ์ที่เป็นไปได้ อาจมีจุดสิ้นสุดในเซิร์ฟเวอร์ของคุณที่ไม่ได้ทำงานบน https แต่มีคนพยายามเข้าถึงด้วยวิธีนี้
Petar Tonev

1
สวัสดีปีเตอร์ ... ปัญหาที่เกิดขึ้นคือมีคนสร้างกฎ IP Tables เพื่อส่งต่อพอร์ต 80 ไปยังพอร์ต 8443 ดังนั้นใครก็ตามที่เข้าชมไซต์โดยใช้ http บนพอร์ต 80 ทำให้เกิดข้อผิดพลาดนั้น เราได้เพิ่มตัวเชื่อมต่อ Tomcat เพื่อเปลี่ยนเส้นทางพอร์ต 8080 ถึง 8443 และตั้งค่ากฎ IP Tables เพื่อส่งต่อพอร์ต 80 ไปยังพอร์ต 8080 และปัญหานั้นหมดไปแล้ว ขอบคุณสำหรับคำตอบของคุณ!
Jim Archer

1
@PeterTonev: มีความคิดวิธีใดบ้าง (เปลี่ยนเส้นทาง https เป็น http || ปิดการใช้งาน https || จับข้อผิดพลาดเป็นอย่างน้อยแสดงข้อความข้อผิดพลาดที่มีความหมาย)?
crusy

1
@crusy สิ่งที่อาจช่วยคุณที่นี่สำหรับการจัดการข้อยกเว้นคือลิงค์
Petar 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 วิธีนี้จะช่วยแก้ปัญหา


อาจเป็นไปได้ว่าคุณไม่มี https: // on 8080 เปลี่ยนการโทรเป็นhttps: // localhost: 8443 / foo / bar - นี่คือลิงค์ตัวอย่าง- Rodrigo R. Coelho
Rodrigo R. Coelho

9

ในกรณีที่มีคนใช้กร่าง:

เปลี่ยน Scheme เป็นHTTPหรือHTTPSขึ้นอยู่กับความต้องการก่อนที่จะกดรัน

บุรุษไปรษณีย์:

เปลี่ยนเส้นทาง URL เป็น http://หรือhttps://ในที่อยู่ URL


8

ฉันได้รับข้อยกเว้นนี้ไม่เกี่ยวข้องกับปัญหา TLS ใด ๆ ในกรณีของฉันค่าส่วนหัวความยาวเนื้อหาไม่ตรงกับความยาวร่างกาย


2
ฉันไม่สามารถขอบคุณได้มากพอ คำขอ POST อื่น ๆ ทั้งหมดล้มเหลวด้วยข้อผิดพลาด 400 และฉันก็พร้อมที่จะตัดผมของฉัน กลายเป็นว่าไม่ได้ส่งcontent-lengthหัวแก้ปัญหานี้
Alexander

2
ฉันได้รับล่าช้า 30-90sec สำหรับคำขอบุรุษไปรษณีย์ไปยังผู้พัฒนาในท้องถิ่น - ปรากฎว่าเป็นปัญหานี้! การปิดใช้งานContent-Lengthส่วนหัวแก้ไขความล่าช้า
Alok

1

ตอบคำถามเก่านี้ (สำหรับคนอื่นซึ่งอาจช่วยได้) การ

กำหนดค่า httpd conf ของคุณให้ถูกต้องจะทำให้ปัญหาแก้ไขได้ ติดตั้งเซิร์ฟเวอร์ httpd ใด ๆ หากคุณยังไม่มี

แสดงรายการ config ของฉันที่นี่

[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


แล้วขอด้วยด้วยhttpsจะทำงานโดยไม่มีข้อยกเว้น
ยังขอด้วยhttpจะส่งต่อไปhttps! ไม่ต้องห่วง.


1

ฉันได้รับข้อผิดพลาดนี้แก้ไขได้ด้วยการทำ 2 สิ่งในเบราว์เซอร์ chrome:

  1. กด Ctrl + Shift + Delete และล้างข้อมูลการท่องเว็บทั้งหมดตั้งแต่ต้น
  2. ไปที่ Chrome: การตั้งค่า -> การตั้งค่าขั้นสูง -> เปิดการตั้งค่าพร็อกซี -> คุณสมบัติอินเทอร์เน็ตแล้วไปที่หน้าต่างเนื้อหาและคลิกที่ปุ่มล้างสถานะ SSL

ไซต์นี้มีข้อมูลนี้และตัวเลือกอื่น ๆ เช่นกัน: https://www.thesslstore.com/blog/fix-err-ssl-protocol-error/


1

ฉันรู้ว่านี่เป็นหัวข้อเก่า แต่มีบางกรณีที่อาจเกิดขึ้น:

หากคุณใช้เกตเวย์ AWS api ควบคู่กับลิงก์ VPC และหาก Network Load Balancer เปิดใช้งานพร็อกซีโปรโตคอล v2 จะมีคำขอ 400 คำขอที่ไม่ถูกต้องเช่นกัน

พาฉันไปทั้งบ่ายเพื่อคิดออกดังนั้นถ้ามันอาจช่วยคนที่ฉันดีใจ :)


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 หน้าหนึ่งของฉันคือ https แทนที่จะเป็น http เมื่อฉันเปลี่ยนเหมือนเดิมข้อผิดพลาดก็หายไป


0

มักจะเกิดขึ้นเมื่อคุณใช้ รูปแบบ URIที่เซิร์ฟเวอร์ไม่รองรับซึ่งมีการปรับใช้แอพ ดังนั้นคุณอาจต้องการตรวจสอบทุกรูปแบบที่เซิร์ฟเวอร์ของคุณสนับสนุนและแก้ไขคำขอของคุณURIตามนั้นหรือคุณอาจต้องการเพิ่มการสนับสนุนสำหรับรูปแบบนั้นในเซิร์ฟเวอร์ของคุณ ขอบเขตแอปพลิเคชันของคุณจะช่วยคุณตัดสินใจในเรื่องนี้


0

มันเกิดขึ้นกับฉันเมื่อฉันมีพอร์ตเดียวกันที่ใช้ใน ssh tunnel SOCKS เพื่อเรียกใช้พร็อกซีในพอร์ต 8080 และเซิร์ฟเวอร์ของฉันและพร็อกซีเบราว์เซอร์ Firefox ของฉันถูกตั้งค่าเป็นพอร์ตนั้นและได้รับปัญหานี้


0

ในกรณีของฉันฉันต้องล้างประวัติเบราว์เซอร์ / คุกกี้เพื่อกำจัดข้อผิดพลาดนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.