Đặt $ _SERVER ['HTTPS'] = 'on' sẽ ngăn truy cập vào wp-admin


16

Trước hết máy chủ của tôi đang ngồi phía sau một bộ cân bằng tải. Chứng chỉ SSL của tôi nằm trên bộ cân bằng tải và xử lý HTTPS. Dữ liệu đến trên cổng 443 được chuyển tiếp đến máy chủ Wordpress bằng HTTP trên cổng 80.

Tuy nhiên, wordpress và php không biết cấu hình máy chủ của tôi. Điều này khiến trình duyệt nghi ngờ về tính hợp lệ của chứng chỉ SSL hợp lệ của tôi.

Để sửa lỗi này, tôi đã thêm đoạn mã sau vào hàm.php. Tôi tìm thấy này ở đâycodex đồng ý .

/**
 * 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';
}

Điều này hoạt động rất tốt cho frontend, nhưng bây giờ / wp-admin / không thể truy cập được ngay cả với tài khoản Admin của tôi. Sau khi đăng nhập tôi nhận được một tin nhắn, "Xin lỗi, bạn không được phép truy cập trang này." Không có sự giúp đỡ nào khác được cung cấp.

Vì vậy, tôi đã tìm kiếm thông qua thư mục wp-admin và phát hiện ra rằng dòng chữ "Xin lỗi, bạn không được phép truy cập trang này." xuất hiện 17 lần khác nhau.

Hầu hết các thông báo lỗi này được liên kết với kiểm tra quyền của người dùng.

Làm cách nào để giữ HTTPS 'bật' và duy trì quyền truy cập của quản trị viên?

Tóm lược:

  • Trước khi thêm logic HTTP_X_FORWARDED_PROTO vào hàm.php Tôi có thể truy cập wp-admin /
  • Sau khi thêm logic HTTP_X_FORWARDED_PROTO vào hàm.php Tôi không thể truy cập wp-admin /
  • Sau khi xóa logic HTTP_X_FORWARDED_PROTO sang hàm.php Tôi không thể truy cập wp-admin /

CẬP NHẬT:

Tôi đã phát hiện ra rằng thông báo lỗi đến từ wp-admin / menu.php và đoạn mã này ở phía dưới. Tôi đã thêm vào menu.phpcuối lỗi để tìm ra rằng đó là tập tin này.

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 );
}

Tôi vẫn không hiểu làm thế nào để sửa lỗi này.


1
Bạn không nói nhiều về phần còn lại của cấu hình của bạn. Bạn đã đặt chưadefine('FORCE_SSL_ADMIN', true);
user42826

Tôi không định nghĩa 'FORCE_SSL_ADMIN'. Tôi sẽ thử nó.
nu everest

bạn cần kiểm tra xem các cookie https cũng được gửi từ bộ cân bằng tải qua http. Có vẻ như họ không được gửi. Rõ ràng cũng có cách khác để kiểm tra, là các cookie mà bạn đặt đang được chuyển qua https
Mark Kaplun

Câu trả lời:


19

Đặc biệt cảm ơn người dùng42826.

Theo bộ luật:

Nếu WordPress được lưu trữ phía sau một proxy ngược cung cấp SSL, nhưng được lưu trữ mà không có SSL, các tùy chọn này ban đầu sẽ gửi bất kỳ yêu cầu nào vào một vòng lặp chuyển hướng vô hạn. Để tránh điều này, bạn có thể định cấu hình WordPress để nhận ra tiêu đề HTTP_X_FORWARDED_PROTO (giả sử bạn đã định cấu hình đúng proxy ngược để đặt tiêu đề đó).

Các hành động sau đây sẽ giải quyết vấn đề.

Thêm phần này vào wp-config.php. ( tài liệu tham khảo )

/* 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';
}

Loại bỏ cái này khỏi Hàm.php vì nó không cần thiết.

/**
 * 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
Lý do là các phiên bảo mật cookie bị mất khi đứng sau bộ cân bằng tải vì LB đang thực hiện SSL nhưng phụ trợ là http đơn giản. Rất vui khi thấy những người khác làm việc trên các kiến ​​trúc cấp doanh nghiệp;)
user42826

@ user42826 Điều tuyệt vời ở thiết lập này là tôi có thể nhận xét FORCE_SSL_ADMIN nếu tôi muốn cấm truy cập quản trị viên, hoặc có những tác dụng phụ nào khác khiến tôi phải xem xét lại dòng suy nghĩ này không?
nu everest

1
Trong thiết lập của bạn, có vẻ như không đặt FORCE_SSL_ADMIN ngăn chặn quyền truy cập của quản trị viên, nhưng có nhiều cách tốt hơn để làm điều đó tùy thuộc vào yêu cầu của bạn. Ví dụ: ngăn truy cập wp-admin hoặc wp-login.php trong cấu hình .htaccess hoặc apache, xóa xác thực gốc WP thông qua plugin, kiến ​​trúc lại WP để url wp-admin khác với url công khai, v.v.
user42826

6
Hãy chắc chắn để thêm mã này trước require_once(ABSPATH . 'wp-settings.php');dòng. Đặc biệt cảm ơn jtl trong câu trả lời này.
Aaroninus

@Aaroninus cảm ơn, tôi sử dụng SSL linh hoạt Cloudflare và không có nhận xét của bạn, tôi sẽ mất thời gian tìm kiếm lại. Tôi đã tìm thấy câu hỏi liên quan này trước đây: wordpress.stackexchange.com/questions/170165/
triệt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.