Когда ссылка сброса пароля открывает пустую страницу, пользователь не понимает, истекла ссылка или сайт просто сломался. Обычно причина в fatal error, неверном роуте, невалидном токене, конфликте шаблона или ошибке после перехода с письма на HTTPS.

Нужно проверить не только саму страницу, но и весь путь: генерацию токена, письмо, URL, обработчик ссылки, проверку срока действия и форму нового пароля.

Что проверить в первую очередь

  • Откройте ссылку в режиме инкогнито и сохраните точный URL без публикации токена.
  • Проверьте HTTP-статус: 200 с пустым телом, 500, 404 или редирект.
  • Найдите ошибку PHP или приложения в логах на момент открытия ссылки.
  • Проверьте, не обрезает ли почтовый клиент параметры ссылки.

Основные причины

Такая проблема редко появляется сама по себе. Обычно ломается связка из нескольких настроек: данные уходят не туда, событие приходит не в том порядке, старая логика остается в кеше или права проверяются не на том уровне. Поэтому сначала нужно отделить симптом от причины.

  • Маршрут сброса пароля не принимает GET-запрос с нужными параметрами.
  • Токен истек, удален или сравнивается в неправильном формате.
  • Шаблон формы падает из-за отсутствующего пользователя или локали.
  • После редиректа с http на https теряется query string.

Пошаговая диагностика

  • Проверьте таблицу токенов: хеш, срок действия, признак использования и user_id.
  • Сравните ссылку в письме с тем URL, который получает сервер.
  • Временно включите логирование исключений без вывода деталей пользователю.
  • Проверьте обработку истекшей ссылки: должна быть понятная ошибка, а не пустота.
  • Протестируйте сброс для обычного пользователя, заблокированного аккаунта и соцлогина.

Как исправить

Исправление лучше делать небольшими шагами. Сначала зафиксируйте текущее поведение, затем внесите одну правку, проверьте контрольный сценарий и только после этого переходите к следующему месту. Так проще понять, какая именно правка решила проблему.

  • Исправьте роутинг и сохранение query string при редиректах.
  • Добавьте явные страницы для невалидной, истекшей и уже использованной ссылки.
  • Проверяйте токен в постоянное время и храните в базе хеш, а не исходное значение.
  • Не удаляйте токен до успешной смены пароля.
  • После смены пароля завершайте старые сессии и отправляйте уведомление.

Безопасный план решения

  • Сделайте резервную копию файлов, базы или конфигурации, если правка затрагивает рабочий проект.
  • Повторите ошибку на тестовом пользователе, заказе, заявке или окружении, чтобы не работать вслепую.
  • Внесите минимальное изменение и сохраните возможность быстрого отката.
  • Проверьте основной сценарий, крайние случаи и права доступа для разных ролей.
  • После выкладки посмотрите логи и реальные события за первые часы работы.

Как проверить результат

  • Новая ссылка открывает форму смены пароля с корректным HTTP-статусом.
  • Истекшая ссылка показывает понятное сообщение и кнопку запроса новой.
  • Повторное использование ссылки невозможно.
  • После смены пароля вход работает новым паролем, а старые сессии закрыты.

Чего не стоит делать

  • Не отключайте проверки, права, платежные статусы или защиту только ради быстрого исчезновения ошибки.
  • Не правьте рабочую базу массовым запросом без выборки, бэкапа и понимания последствий.
  • Не ориентируйтесь только на один успешный тест: проверьте повторный запуск, отмену, ошибку и нестандартные данные.
  • Не оставляйте временные ключи, токены, debug-режим и лишний вывод в публичном доступе.

Как не допустить повторения

  • Покройте сценарии сброса пароля автоматическими тестами.
  • Логируйте ошибки восстановления доступа отдельно от обычных страниц.
  • Не меняйте формат URL в письмах без проверки почтовых клиентов.
  • Проверяйте восстановление пароля после обновлений CMS и роутинга.

Что подготовить перед исправлением

  • Ссылку на проблемную страницу, кабинет, заказ, интеграцию или API-метод.
  • Точное время ошибки и пример пользователя, товара, платежа или запроса.
  • Скриншот, текст ошибки, лог веб-сервера, приложения или webhook-события.
  • Краткое описание ожидаемого поведения: что должно было произойти вместо ошибки.

Частые вопросы

Почему страница пустая, а не показывает ошибку?

На production часто отключен вывод ошибок. Это правильно, но ошибка должна попадать в лог и показываться пользователю понятным сообщением.

Можно ли увеличить срок жизни ссылки?

Можно, но это не всегда безопасно. Лучше держать разумный срок и сделать удобный повторный запрос ссылки.

Когда стоит обратиться за помощью

Если пользователи не могут восстановить доступ, это напрямую бьет по заявкам и оплатам. Нужны логи, пример письма и тестовый аккаунт.

Итог

Сброс пароля должен быть предсказуемым: понятная ошибка, безопасный токен и рабочая форма. Я могу найти место сбоя и привести восстановление доступа в нормальное состояние.