Easy Digital Downloads tiene un sistema robusto para mantener seguros los enlaces de descarga de sus archivos y evitar que se abusen de ellos. Cuando se hace clic en un enlace de descarga de archivo, el orden de los parámetros proporcionados es importante. De vez en cuando, ciertas configuraciones de alojamiento, capas de caché o proveedores de CDN pueden reordenar los parámetros de la cadena de consulta para permitir cierto nivel de caché básico. Reordenar estos elementos hará que Easy Digital Downloads falle la validación del token para el enlace de descarga de un cliente.
¿Cómo puedo saber si este es mi problema?
Si, cuando un usuario hace clic para descargar sus archivos, recibe el error “No tiene permiso para descargar este archivo”, compruebe que la URL todavía tiene el siguiente formato, prestando mucha atención al orden de los parámetros.
https://example.org/index.php?eddfile=...&ttl=...&file=...&token=...
Si los parámetros de la cadena de consulta no están en el orden anterior, entonces está experimentando el problema descrito anteriormente. Tenemos algunas soluciones para ayudar a prevenir que esto ocurra.
Si tiene configurado un sistema de caché de páginas, como Cloudflare o Varnish, es posible que todavía vea este error aunque sus parámetros parezcan estar en el orden correcto. Esto se debe a que el sistema de caché de páginas ordena esos parámetros antes de enviar su solicitud al servidor web para que sea procesada por PHP.
¿Cómo puedo prevenir este problema?
Cambios en la configuración del alojamiento
La situación ideal es no tener que sus proveedores reordenen los parámetros de la cadena de consulta cuando la solicitud es para una descarga de archivo, evitando que cualquier solicitud que contenga el parámetro de cadena de consulta eddfile sea procesada por las reglas de reordenación.
Si está utilizando Cloudflare y ha habilitado su función de ordenación de cadenas de consulta, debería poder deshabilitar esta función para permitir que los usuarios descarguen sus archivos sin errores.
Fragmento de código personalizado
Reconocemos que esto puede no ser siempre posible con algunos proveedores, por lo que hemos escrito una pequeña función que ejecutará cualquier validación fallida una segunda vez, para verificar que recibimos los elementos en el orden correcto.
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 );
La función anterior debe probarse en un entorno de ensayo antes de usarla en un entorno de producción, para verificar que funciona correctamente en su configuración específica.
