O Easy Digital Downloads possui um sistema robusto para manter os links de download de seus arquivos seguros e evitar que sejam mal utilizados. Quando um link de download de arquivo é clicado, a ordem dos parâmetros fornecidos é importante. De tempos em tempos, certas configurações de hospedagem, camadas de cache ou provedores de CDN podem reordenar os parâmetros da string de consulta para permitir algum cache de nível básico. Reordenar esses itens fará com que o Easy Digital Downloads falhe na validação do token para o link de download de um cliente.
Como posso saber se este é o meu problema?
Se, quando um usuário clica para baixar seus arquivos, ele recebe o erro “Você não tem permissão para baixar este arquivo”, verifique se o URL ainda tem o seguinte formato, prestando muita atenção à ordem dos parâmetros.
https://example.org/index.php?eddfile=...&ttl=...&file=...&token=...
Se os parâmetros da string de consulta não estiverem na ordem acima, então você está experimentando o problema descrito acima. Temos algumas soluções para ajudar a evitar que isso ocorra.
Se você configurou um sistema de cache de página, como Cloudflare ou Varnish, ainda poderá ver este erro, mesmo que seus parâmetros pareçam estar na ordem correta. Isso ocorre porque o sistema de cache de página classifica esses parâmetros antes de enviar sua solicitação ao servidor web para ser processada pelo PHP.
Como posso evitar este problema?
Alterações na configuração de hospedagem
A situação ideal é não ter seus provedores reordenando os parâmetros da string de consulta quando a solicitação é para um download de arquivo, impedindo que qualquer solicitação contendo o parâmetro de consulta eddfile seja passada pelas regras de reordenação.
Se você estiver usando o Cloudflare e ativou o recurso Classificação de String de Consulta, deverá ser capaz de desativar esse recurso para permitir que os usuários baixem seus arquivos sem erros.
Trecho de código personalizado
Reconhecemos que isso nem sempre pode ser possível com alguns provedores, por isso escrevemos uma pequena função que executará qualquer validação falha uma segunda vez, para verificar se recebemos os itens na ordem correta.
function ck_custom_validate_url_token( $ret, $url, $query_args ) {
// If basic validation failed, let's make sure the URL prarms were in the right order and try again
if ( false === $ret ) {
$parts = parse_url( $url );
wp_parse_str( $parts['query'], $query_args );
$fix_arg_order = array(
'eddfile' => $query_args['eddfile'],
'ttl' => $query_args['ttl'],
'file' => $query_args['file'],
'token' => $query_args['token'],
);
$fixed_url = add_query_arg( $fix_arg_order, site_url() );
$fixed_token = edd_get_download_token( $fixed_url );
$ret = $query_args['token'] === $fixed_token;
}
return $ret;
}
add_filter( 'edd_validate_url_token', 'ck_custom_validate_url_token', 10, 3 );
A função acima deve ser testada em um ambiente de staging antes de ser usada em um ambiente de produção, para verificar se funciona corretamente em sua configuração específica.
