วิธีแก้ปัญหา Webhook ไม่ได้รับค่า Query String (Flask + Passenger + .htaccess)
หากคุณใช้งานแอป Python (Flask) ผ่าน Phusion Passenger บนโฮสต์ที่ใช้ Apache แล้วพบว่าแอปของคุณ ไม่สามารถรับค่าจาก Query String ได้ เช่น
https://yourdomain.com/webhook?hub.mode=subscribe&hub.verify_token=test
แต่โค้ด Flask ได้รับค่าแบบนี้:
request.query_string ➜ b''
request.args.get('hub.verify_token') ➜ None
แสดงว่า Apache ไม่ได้ส่งค่า ?param=value
ไปยังแอป Flask ของคุณ
✅ วิธีแก้ไขโดยใช้ .htaccess
- เข้าไปยังโฟลเดอร์ที่เก็บโปรเจกต์ของคุณ เช่น
/home/USERNAME/your_flask_project/
- สร้างหรือเปิดไฟล์ชื่อ
.htaccess
- ใส่โค้ดต่อไปนี้:
PassengerEnabled on
PassengerAppRoot /home/USERNAME/your_flask_project
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ http://127.0.0.1:5000/$1 [P,L,QSA]
อย่าลืมแก้ USERNAME และชื่อโฟลเดอร์ให้ตรงกับของคุณจริง ๆ
คำอธิบายแต่ละคำสั่ง
PassengerEnabled on
➜ เปิดใช้งาน PassengerPassengerAppRoot
➜ กำหนด path ของแอป FlaskRewriteEngine On
➜ เปิดการ rewriteRewriteCond %{REQUEST_FILENAME} !-f
➜ ตรวจสอบว่าไม่ใช่ไฟล์จริง[P,L,QSA]
➜ สำคัญมาก! ใช้ QSA เพื่อแนบ query string ไปด้วย
✅ ทดสอบผลลัพธ์
เรียก URL แบบนี้:
https://yourdomain.com/webhook?hub.verify_token=abc123
แล้วตรวจสอบใน Flask:
print(request.query_string) ➜ b'hub.verify_token=abc123'
print(request.args.get("hub.verify_token")) ➜ 'abc123'
หมายเหตุ
- คุณไม่ต้องรีสตาร์ท Apache เมื่อแก้ไขไฟล์ .htaccess
- หากยังไม่ได้ผล ให้ตรวจสอบว่าเซิร์ฟเวอร์อนุญาต
.htaccess
โดยตั้งค่าAllowOverride All
ใน Apache VirtualHost แล้ว
หากคุณยังมีคำถามเพิ่มเติม หรือต้องการให้เจ้าหน้าที่ช่วยตรวจสอบการตั้งค่า Passenger หรือ Apache ของคุณเพิ่มเติม กรุณาติดต่อฝ่ายเทคนิคของเราได้ตลอดเวลา