¿Por qué ocurre el error 'Invalid Form Key. Please refresh the page' en Magento?
El error 'Invalid Form Key' en Magento 2 es un mecanismo de seguridad diseñado para prevenir ataques de falsificación de solicitudes en sitios cruzados (CSRF). Magento genera una clave única (form key) para cada sesión de usuario y la valida en cada envío de formulario. Si hay una discrepancia entre la clave enviada y la almacenada en la sesión, el sistema bloquea la acción mostrando este mensaje.
Este problema se presenta con mayor frecuencia al intentar iniciar sesión en el panel de administración, al guardar configuraciones de la tienda o al añadir productos masivamente al carrito. Las causas principales suelen ser una configuración incorrecta de las cookies, límites insuficientes en la configuración de PHP o problemas de caché en el servidor.
Método 1: Incrementar el valor de max_input_vars en PHP
Cuando trabajas con catálogos grandes o guardas configuraciones extensas en Magento, el formulario envía miles de variables simultáneamente. Si el límite establecido en la directiva max_input_vars de PHP es muy bajo, el servidor web truncará los datos del formulario, eliminando la clave de formulario (form key) antes de que Magento pueda validarla.
Para solucionar esto, debes modificar la configuración de tu servidor de la siguiente manera:
- Accede a tu servidor a través de SSH o mediante el administrador de archivos de tu hosting.
- Localiza y abre tu archivo de configuración de PHP activo, comúnmente llamado
php.ini. - Busca la línea que contiene
max_input_vars. Si está comentada con un punto y coma (;) al principio, elimínalo. - Cambia su valor a un mínimo de 10000 o más si manejas una tienda compleja:
max_input_vars = 10000 - Guarda los cambios en el archivo.
- Reinicia tu servicio de servidor web (Apache, Nginx o PHP-FPM) para aplicar los cambios usando uno de los siguientes comandos según tu sistema:
sudo systemctl restart apache2o biensudo systemctl restart php-fpm.
Método 2: Configurar correctamente el dominio y tiempo de vida de las Cookies
Una discrepancia entre el dominio configurado en la base de datos de Magento y el dominio real desde el cual accedes causará que el navegador no envíe las cookies de sesión correctas, disparando el error de validación de formulario.
Puedes corregir esta configuración directamente en la base de datos ejecutando consultas SQL desde phpMyAdmin o la consola de MySQL:
- Accede a tu base de datos de Magento.
- Busca la tabla llamada
core_config_data. - Verifica los valores para las siguientes rutas (path) y asegúrate de que coincidan exactamente con tu dominio real:
web/cookie/cookie_domainyweb/cookie/cookie_lifetime. - Si estás trabajando en un entorno local (localhost), es altamente recomendable dejar el valor de
web/cookie/cookie_domaincompletamente vacío o como NULL para evitar conflictos de resolución de nombres. Puedes actualizarlo con la siguiente consulta:UPDATE core_config_data SET value = NULL WHERE path = 'web/cookie/cookie_domain'; - Adicionalmente, asegúrate de que el tiempo de vida de las cookies (cookie lifetime) no esté definido en 0. Un valor óptimo es 86400 (24 horas):
UPDATE core_config_data SET value = 86400 WHERE path = 'web/cookie/cookie_lifetime';
Método 3: Limpiar la caché de Magento y del navegador
Si has aplicado los cambios anteriores y el error persiste, es probable que la sesión antigua siga almacenada en la caché de tu navegador o en los sistemas de almacenamiento de caché del servidor (como Redis o Varnish).
Sigue estos pasos para realizar una limpieza profunda:
- Abre la terminal de tu servidor y dirígete al directorio raíz de tu instalación de Magento.
- Limpia la caché de Magento ejecutando el comando:
php bin/magento cache:cleany luegophp bin/magento cache:flush. - Si usas almacenamiento de sesiones en archivos de sistema, elimina el contenido de la carpeta de sesiones temporales con:
rm -rf var/session/*. - Finalmente, abre tu navegador web, borra la caché y las cookies correspondientes a tu dominio de Magento, o intenta acceder utilizando una ventana de navegación de incógnito privada.