การตั้งค่า $ _SERVER ['HTTPS'] = 'เปิด' ป้องกันการเข้าถึง wp-admin


16

ก่อนอื่นเซิร์ฟเวอร์ของฉันกำลังนั่งอยู่หลังโหลดบาลานเซอร์ ใบรับรอง SSL ของฉันตั้งอยู่บน load balancer และจัดการ HTTPS ข้อมูลที่เข้ามาในพอร์ต 443 จะถูกส่งต่อไปยังเซิร์ฟเวอร์ Wordpress โดยใช้ HTTP ที่พอร์ต 80

อย่างไรก็ตาม wordpress และ php ไม่รู้จักการกำหนดค่าเซิร์ฟเวอร์ของฉัน นี่ทำให้เบราว์เซอร์สงสัยเกี่ยวกับความถูกต้องของใบรับรอง SSL ที่ถูกต้องของฉัน

ในการแก้ไขปัญหานี้ฉันได้เพิ่มรหัสต่อไปนี้ลงใน functions.php ฉันพบรหัสที่นี่และCodex ตกลง

/**
 * Make PHP HTTPS aware via HTTP_X_FORWARDED_PROTO
 */
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
    $_SERVER['HTTPS']='on';
}

วิธีนี้ใช้งานได้ดีสำหรับส่วนหน้า แต่ตอนนี้ / wp-admin / ไม่สามารถเข้าถึงได้แม้จะมีบัญชีผู้ดูแลระบบของฉัน หลังจากเข้าสู่ระบบฉันได้รับข้อความ "ขออภัยคุณไม่ได้รับอนุญาตให้เข้าถึงหน้านี้" ไม่มีความช่วยเหลืออื่นให้ไว้

ดังนั้นฉันค้นหาผ่านโฟลเดอร์ wp-admin และค้นพบว่าคำว่า "ขออภัยคุณไม่ได้รับอนุญาตให้เข้าถึงหน้านี้" ปรากฏ 17 ครั้งที่แตกต่างกัน

ข้อความแสดงข้อผิดพลาดส่วนใหญ่เกี่ยวข้องกับการตรวจสอบการอนุญาตของผู้ใช้

ฉันจะให้ 'เปิด' HTTPS และรักษาการเข้าถึงของผู้ดูแลระบบได้อย่างไร

สรุป:

  • ก่อนที่จะเพิ่มตรรกะ HTTP_X_FORWARDED_PROTO ให้กับ function.php ฉันสามารถเข้าถึง wp-admin /
  • หลังจากเพิ่มตรรกะ HTTP_X_FORWARDED_PROTO ลงใน function.php ฉันไม่สามารถเข้าถึง wp-admin /
  • หลังจากลบตรรกะ HTTP_X_FORWARDED_PROTO ไปที่ functions.php ฉันไม่สามารถเข้าถึง wp-admin /

UPDATE:

ฉันพบว่าข้อความแสดงข้อผิดพลาดนั้นมาจาก wp-admin / menu.php และโค้ดอันนี้ที่ด้านล่าง ฉันเพิ่มลงmenu.phpในตอนท้ายของข้อผิดพลาดเพื่อหาว่ามันเป็นไฟล์นี้

if ( !user_can_access_admin_page() ) {

    /**
     * Fires when access to an admin page is denied.
     *
     * @since 2.5.0
     */
    do_action( 'admin_page_access_denied' );

    wp_die( __( 'Sorry, you are not allowed to access this page. menu.php'), 403 );
}

ฉันยังไม่เข้าใจวิธีการแก้ไขนี้


1
คุณไม่ได้พูดอะไรมากเกี่ยวกับการกำหนดค่าที่เหลือของคุณ คุณได้ตั้งค่าdefine('FORCE_SSL_ADMIN', true);
user42826

ฉันไม่ได้กำหนด 'FORCE_SSL_ADMIN' ฉันจะลองดู
nu everest

คุณต้องตรวจสอบว่ามีการส่งคุกกี้ https จาก load balancer ผ่าน http ดูเหมือนว่าพวกเขาจะไม่ถูกส่ง เห็นได้ชัดว่าวิธีอื่น ๆ ที่ต้องตรวจสอบคือคุกกี้ที่คุณตั้งค่าจะถูกถ่ายโอนผ่าน https
Mark Kaplun

คำตอบ:


19

ขอบคุณเป็นพิเศษกับ user42826

ตาม codex:

หาก WordPress โฮสต์อยู่ด้านหลัง reverse proxy ที่ให้ SSL แต่โฮสต์โดยไม่มี SSL ตัวเลือกเหล่านี้จะเริ่มส่งคำขอใด ๆ ลงในลูปการเปลี่ยนเส้นทางแบบไม่สิ้นสุด เพื่อหลีกเลี่ยงปัญหานี้คุณอาจกำหนดค่า WordPress ให้รู้จักส่วนหัว HTTP_X_FORWARDED_PROTO (โดยสมมติว่าคุณได้กำหนดค่าพร็อกซีย้อนกลับอย่างถูกต้องเพื่อตั้งค่าส่วนหัวนั้น)

การดำเนินการต่อไปนี้จะช่วยแก้ปัญหา

เพิ่มสิ่งนี้ใน wp-config.php ( การอ้างอิง codex )

/* SSL Settings */
define('FORCE_SSL_ADMIN', true);

/* Turn HTTPS 'on' if HTTP_X_FORWARDED_PROTO matches 'https' */
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
    $_SERVER['HTTPS'] = 'on';
}

ลบสิ่งนี้จาก functions.php เนื่องจากไม่จำเป็น

/**
 * Make PHP HTTPS aware via HTTP_X_FORWARDED_PROTO
 */
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
    $_SERVER['HTTPS']='on';
}

1
เหตุผลก็คือคุกกี้เซสชันที่ปลอดภัยจะหายไปเมื่ออยู่ด้านหลังตัวโหลดบาลานซ์เนื่องจาก LB กำลังทำ SSL แต่แบ็กเอนด์เป็น http ธรรมดา ดีใจที่ได้เห็นคนอื่นทำงานในสถาปัตยกรรมระดับองค์กร;)
42826

@ user42826 สิ่งที่ดีเกี่ยวกับการตั้งค่านี้คือฉันสามารถแสดงความคิดเห็นได้ที่ FORCE_SSL_ADMIN หากฉันต้องการห้ามการเข้าถึงของผู้ดูแลระบบหรือมีผลข้างเคียงอื่น ๆ ที่ทำให้ฉันต้องพิจารณาแนวความคิดนี้อีกหรือไม่
nu everest

1
ในการตั้งค่าของคุณดูเหมือนจะไม่ได้ตั้งค่า FORCE_SSL_ADMIN ป้องกันการเข้าถึงของผู้ดูแลระบบ แต่มีวิธีที่ดีกว่าในการทำเช่นนั้นขึ้นอยู่กับความต้องการของคุณ ตัวอย่าง: ป้องกันการเข้าถึง wp-admin หรือ wp-login.php ในการกำหนดค่า. htaccess หรือ apache, ลบการรับรองความถูกต้องดั้งเดิม WP ผ่านปลั๊กอิน, สร้างสถาปัตยกรรม WP อีกครั้งเพื่อให้ URL ของผู้ดูแลระบบ wp-admin แตกต่างจาก URL สาธารณะ ฯลฯ
user42826

6
ตรวจสอบให้แน่ใจว่าได้เพิ่มรหัสนี้ก่อนrequire_once(ABSPATH . 'wp-settings.php');บรรทัด ขอขอบคุณ jtl เป็นพิเศษในคำตอบนี้
Aaroninus

@Aaroninus ขอบคุณฉันใช้ SSL ที่ยืดหยุ่น Cloudflare และไม่มีความคิดเห็นของคุณฉันจะใช้เวลาค้นหาอีกครั้ง ฉันพบคำถามที่เกี่ยวข้องนี้ก่อนหน้านี้: wordpress.stackexchange.com/questions/170165/…
baptx
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.