WordPress และ SSL termination ด้วย reverse proxy

เมื่อเร็วๆ นี้ได้ทำการอัพเดต site นี้ให้เป็น version ล่าสุด (5.7.2) เพื่อป้องกันปัญหา security ที่อาจจะมีอยู่ แต่กลับทำให้ไม่สามารถเข้าหน้า admin ได้เลย โดยจะขึ้น error 403 (จากตัว wordpress) พร้อมทั้งข้อความดังนี้

Sorry, you are not allowed to access this page.

จริงๆ แล้วสาเหตุที่เกิด error 403 จากการเข้าถึงหน้า wordpress admin เท่านั้น (ไม่ใช่เคสที่การเซ็ตอัพ web server – error page จะไม่เหมือนกัน) เกิดได้จากหลายสาเหตุ ซึ่งวิธีแก้ไขของแต่ละเคสก็จะต่างๆ กันไป สำหรับกรณีของผม error นี้ก็ยังขึ้นแม้กระทั่งเป็นการ clean install โดยที่ configuration เพียงอย่างเดียวที่ทำให้เกิดปัญหาคือ

มีการใช้ reverse proxy เพื่อทำ ssl termination

ซึ่งมีผลทำให้ตัว script ของ wordpress ในการ detect site_url, base_url ทำงานผิดพลาด เนื่องจาก request ที่ตัว php-fpm ของ wordpress นั้นได้รับ เป็น http request

การแก้ไขเพียงแค่เพิ่มค่าใน $_SERVER ใน wp-config.php เพื่อบอกให้ wordpress รู้ – trick สำคัญที่ blog ส่วนใหญ่ไม่ได้บอกไว้คือ “ตำแหน่ง” คือเราต้องเพิ่ม code ราวๆ นี้

if($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
    $_SERVER['HTTPS'] = 'on';
}

โดยจะต้องเพิ่มไว้ก่อนบรรทัดที่มีการ include wp-settings.php จึงจะทำงานได้

ปล. จะใช้ if block หรือใส่ตรงๆ ก็ได้ ขึ้นอยู่กับว่า setting ฝั่ง reverse ส่งข้อมูลอะไรมาให้เราได้ตรวจสอบบ้าง

credit: https://wordpress.stackexchange.com/a/263461