Definir $ _SERVER ['HTTPS'] = 'on' impede o acesso ao wp-admin

16

Primeiro, meu servidor está sentado atrás de um balanceador de carga. Meu certificado SSL fica no balanceador de carga e lida com HTTPS. Os dados que chegam na porta 443 são encaminhados para o servidor Wordpress usando HTTP na porta 80.

No entanto, wordpress e php não conhecem a configuração do meu servidor. Isso faz com que o navegador suspeite da validade do meu certificado SSL válido.

Para corrigir isso, adicionei o seguinte código ao functions.php. Encontrei este código aqui e o códice concorda .

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

Isso funciona muito bem para o frontend, mas agora o / wp-admin / está inacessível mesmo com a minha conta de administrador. Após o login, recebo uma mensagem: "Desculpe, você não tem permissão para acessar esta página". Nenhuma outra ajuda é fornecida.

Então, procurei na pasta wp-admin e descobri que as palavras "Desculpe, você não tem permissão para acessar esta página". aparecem 17 vezes diferentes.

A maioria dessas mensagens de erro está associada a uma verificação de permissões do usuário.

Como mantenho o HTTPS 'ligado' e retiro o acesso de administrador?

Resumo:

  • Antes de adicionar a lógica HTTP_X_FORWARDED_PROTO a functions.php, posso acessar wp-admin /
  • Depois de adicionar a lógica HTTP_X_FORWARDED_PROTO a functions.php, não consigo acessar o wp-admin /
  • Após remover a lógica HTTP_X_FORWARDED_PROTO para functions.php, não consigo acessar o wp-admin /

ATUALIZAR:

Eu descobri que a mensagem de erro vem de wp-admin / menu.php e esse pedaço de código na parte inferior. Eu adicionei menu.phpao final do erro para descobrir que era esse arquivo.

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

Eu ainda não entendo como consertar isso.

nu everest
fonte
1
Você não fala muito sobre o resto da sua configuração. Você definiudefine('FORCE_SSL_ADMIN', true);
user42826
Eu não defini 'FORCE_SSL_ADMIN'. Eu vou tentar isso.
nu everest
você precisa verificar se os cookies https também são enviados do balanceador de carga por http. Parece que eles não foram enviados. Obviamente, também é necessário verificar o contrário, pois os cookies que você define estão sendo transferidos por https #
Mark Kaplun

Respostas:

19

Agradecimentos especiais a user42826.

De acordo com o codex:

Se o WordPress estiver hospedado atrás de um proxy reverso que fornece SSL, mas estiver hospedado sem SSL, essas opções enviarão inicialmente todas as solicitações para um loop de redirecionamento infinito. Para evitar isso, você pode configurar o WordPress para reconhecer o cabeçalho HTTP_X_FORWARDED_PROTO (assumindo que você configurou corretamente o proxy reverso para definir esse cabeçalho).

As ações a seguir resolverão o problema.

Adicione isso ao wp-config.php. ( referência do 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';
}

Remova isso de functions.php, pois é desnecessário.

/**
 * 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
fonte
1
O motivo é que os cookies de sessões seguras são perdidos quando estão atrás do balanceador de carga, porque o LB está executando SSL, mas o back-end é simples. É bom ver outras pessoas trabalhando em arquiteturas de nível corporativo;)
user42826
@ user42826 O que é legal nessa configuração é que eu posso comentar FORCE_SSL_ADMIN se quiser proibir o acesso de administrador, ou existem outros efeitos colaterais que devem me levar a reconsiderar essa linha de pensamento?
nu everest
1
Na sua configuração, parece que a configuração de FORCE_SSL_ADMIN impede o acesso de administrador, mas existem maneiras melhores de fazer isso, dependendo dos seus requisitos. Exemplos: impedir o acesso do wp-admin ou wp-login.php no .htaccess ou na configuração do apache, remover a autenticação nativa do WP via plug-in, reestruturar o WP para que o URL do wp-admin seja diferente do público, etc.
user42826
6
Certifique-se de adicionar esse código antes da require_once(ABSPATH . 'wp-settings.php');linha. Agradecimentos especiais a jtl nesta resposta.
Aaroninus 14/09
@Aaroninus obrigado, eu uso o SSL flexível do Cloudflare e sem o seu comentário eu teria gasto tempo pesquisando novamente. Eu encontrei essa pergunta relacionada anteriormente: wordpress.stackexchange.com/questions/170165/…
baptx