Маршруты с подписью Laravel выбрасывают исключение InvalidSignatureException в процессе производства

Всякий раз, когда я использую URL-адрес, созданный с помощью temporarySignedRoute() на производство, он выдает InvalidSignatureException. Однако в среде разработчик это работает. Я также безуспешно пытался использовать signedRoute().

Я создаю свои URL-адреса следующим образом:

\URL::temporarySignedRoute(
    'user.activate', 
    now()->addHours(200), 
    [ 'id' => $user->id ]
);

Пример URL: https: //xx.xx/activate/5? expires = 1537065074 & signature = f57713b2fccea5ce17b7c1a3241e275d62f1994cd8004ea480cced2402081090

Я убедился, что APP_KEY настроен. Я не совсем уверен, что мне нужно сделать, чтобы это исправить. Я использую Laravel Forge для развертывания. Я также использую балансировщик нагрузки, но только один банкомат сервера приложений.

Why is temporarySignedRoute() throwing InvalidSignatureException in production?

Редактировать:

Регистрируя запрос, я получаю следующие данные:

// [ $expired, $url, $query, $original, $signature ]
[
 false,
 "http://xx.xx/activate/13",{"expires":"1537076308","signature":"9d972a574137bf7e5f30120c3f539a81bca71875020c3476e3bfb230220a73f7"},
 "http://xx.xx/activate/13?expires=1537076308",
 "ed80a6ae717e806fd5f887224c2ac88f5fffb893ae284cc52688ba0690d3a9e1"
]

Обратите внимание, что URL-адрес начинается с http://, но фактическая сгенерированная ссылка использует https://. URL регистрируется с помощью request()->url(). Это наводит меня на мысль, что проблема кроется в http-схеме.

В моем AppServiceProvider.php я использую https следующим образом:

if (env('APP_ENV') == 'production') {
    \URL::forceScheme('https');
}

Почему request() принимает его как не-http?

Предположительно время на вашем рабочем сервере установлено правильно?

Simon R 07.09.2018 23:14

Да, выполнение date возвращает Fri Sep 7 21:16:28 UTC 2018. Но дата на самом деле не имеет значения, правда?

Fredrik 07.09.2018 23:17

Я добавил некоторую отладочную информацию, если вы хотите взглянуть.

Fredrik 07.09.2018 23:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
529
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это было вызвано тем, что мой балансировщик нагрузки не отправлял HTTPS-вызовы на сервер. Это означает, что сервер хеширует другую схему URL (http), чем исходную (https).

Я столкнулся с той же проблемой, и ответ Фредрика помог.

Когда я сбросил запрос при генерации подписанного URL-адреса, я увидел, что мой сервер запрашивал с «http», а не с «https», хотя сайт обслуживался по «https». Мне пришлось изменить настройки Cloudflare, чтобы принудительно использовать https для запросов ...

Другие вопросы по теме