Pengaturan $ _SERVER ['HTTPS'] = 'on' mencegah akses ke wp-admin

16

Pertama server saya duduk di belakang load balancer. Sertifikat SSL saya duduk di penyeimbang beban dan menangani HTTPS. Data yang masuk pada port 443 diteruskan ke server Wordpress menggunakan HTTP pada port 80.

Namun, wordpress dan php tidak tahu konfigurasi server saya. Ini menyebabkan browser menjadi curiga tentang validitas sertifikat SSL saya yang valid.

Untuk memperbaikinya saya menambahkan kode berikut ke functions.php. Saya menemukan kode ini di sini dan codex setuju .

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

Ini berfungsi baik untuk frontend, tetapi sekarang / wp-admin / tidak dapat diakses bahkan dengan akun Admin saya. Setelah masuk saya menerima pesan, "Maaf, Anda tidak diizinkan mengakses halaman ini." Tidak ada bantuan lain yang disediakan.

Jadi saya mencari melalui folder wp-admin dan menemukan bahwa kata-kata "Maaf, Anda tidak diizinkan mengakses halaman ini." muncul 17 waktu yang berbeda.

Sebagian besar pesan kesalahan ini dikaitkan dengan pemeriksaan izin pengguna.

Bagaimana cara menjaga HTTPS 'aktif' dan mempertahankan akses admin?

Ringkasan:

  • Sebelum menambahkan logika HTTP_X_FORWARDED_PROTO ke functions.php saya dapat mengakses wp-admin /
  • Setelah menambahkan logika HTTP_X_FORWARDED_PROTO ke functions.php saya tidak dapat mengakses wp-admin /
  • Setelah menghapus logika HTTP_X_FORWARDED_PROTO ke functions.php saya tidak dapat mengakses wp-admin /

MEMPERBARUI:

Saya telah menemukan bahwa pesan kesalahan berasal dari wp-admin / menu.php dan potongan kode ini di bagian bawah. Saya menambahkan menu.phpke akhir kesalahan untuk mengetahui bahwa itu adalah file ini.

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

Saya masih tidak mengerti bagaimana cara memperbaikinya.

nu everest
sumber
1
Anda tidak banyak bicara tentang sisa konfigurasi Anda. Apakah Anda menyeteldefine('FORCE_SSL_ADMIN', true);
user42826
Saya tidak mendefinisikan 'FORCE_SSL_ADMIN'. Saya akan mencobanya.
nu everest
Anda perlu memeriksa bahwa cookie https juga dikirim dari load balancer melalui http. Sepertinya mereka tidak terkirim. Jelas juga sebaliknya yang perlu diperiksa, apakah cookie yang Anda setel sedang ditransfer ke https
Mark Kaplun

Jawaban:

19

Terima kasih khusus kepada user42826.

Menurut kodeks:

Jika WordPress di-host di belakang proksi terbalik yang menyediakan SSL, tetapi di-host sendiri tanpa SSL, opsi-opsi ini pada awalnya akan mengirim permintaan apa pun ke loop pengalihan tak terbatas. Untuk menghindari hal ini, Anda dapat mengonfigurasi WordPress untuk mengenali tajuk HTTP_X_FORWARDED_PROTO (dengan asumsi Anda telah mengonfigurasi proxy terbalik dengan benar untuk menyetel tajuk itu).

Tindakan berikut ini akan menyelesaikan masalah.

Tambahkan ini ke wp-config.php. ( referensi kodeks )

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

Hapus ini dari functions.php karena tidak perlu.

/**
 * 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';
}
nu everest
sumber
1
Alasannya adalah bahwa cookie sesi aman hilang ketika berada di belakang load balancer karena LB melakukan SSL tetapi backend adalah http biasa. Senang melihat orang lain bekerja pada arsitektur tingkat perusahaan;)
user42826
@ user42826 Apa yang baik tentang pengaturan ini adalah saya bisa berkomentar FORCE_SSL_ADMIN jika saya ingin melarang akses admin, atau apakah ada efek samping lain yang membuat saya mempertimbangkan kembali pemikiran ini?
nu everest
1
Dalam pengaturan Anda, sepertinya tidak mengatur FORCE_SSL_ADMIN mencegah akses admin, tetapi ada cara yang lebih baik untuk melakukannya tergantung pada kebutuhan Anda. Contoh: mencegah akses wp-admin atau wp-login.php dalam konfigurasi .htaccess atau apache, hapus autentikasi WP asli melalui plugin, arsitektur ulang WP sehingga url wp-admin berbeda dari url publik, dll
user42826
6
Pastikan untuk menambahkan kode ini sebelum require_once(ABSPATH . 'wp-settings.php');baris. Terima kasih khusus kepada jtl dalam jawaban ini.
Aaroninus
@Aaroninus terima kasih, saya menggunakan Cloudflare fleksibel SSL dan tanpa komentar Anda, saya akan menghabiskan waktu mencari lagi. Saya menemukan pertanyaan terkait ini sebelumnya: wordpress.stackexchange.com/questions/170165/…
baptx