Перенаправление Laravel на причину: «Все запросы инерции должны получить действительный ответ инерции» при доступе через Интернет

Использование Laravel 11 с InertiaJS и Svelte.

У меня есть файл admin.php, в котором есть некоторые маршруты, охраняемые промежуточным программным обеспечением аутентификации. Я хочу, чтобы маршрут «/admin» перенаправлялся на /admin/posts или /login, если пользователь не вошел в систему. Используя компонент <Link> Inertia, переход по этому маршруту должен перенаправляться на /admin/posts или /login, а не обновлять приложение.

Вместо этого он возвращает All Inertia requests must receive a valid Inertia response, however a plain JSON response was received. Немного поискав, я обнаружил, что Inertia нужен заголовок X-Inertia, но он присутствует в заголовках ответов.

Веб-сайт находится за Nginx Proxy Manager. Он настроен на передачу заголовков X-Inertia и X-Inertia-Version.

Сайт на данный момент доступен по адресу https://pwa.skmedia.cc . При переходе в «Администрирование» должна появиться ошибка. Код находится на github здесь

Веб-сайт работает локально, когда он обслуживается с помощью php artisan serve, но при развертывании на сервере за Nginx Proxy Manager перенаправленные инерционные ссылки возвращают ошибку. Перенаправление обратно с помощью redirect()->back() работает нормально, но я хочу перенаправить на другую страницу.

Я могу использовать Inertia::location(), но это обновит страницу, чего мне бы хотелось избежать.

например в web.php, если у меня есть:

Route::get('/redirected', function(){ return redirect()->to('/destination'); });
Route::get('/destination', function(){ return Inertia::render('Example'); });

В resources/js/Pages пустой Example.svelte файл, а в моей навигации что-то вроде:

<script>
    import { Link } from "@inertiajs/svelte";
</script>

<Link href = "/redirected">Redirected</Link>

Нажатие на эту ссылку на веб-сайте в разделе «Производство» возвращает:

All Inertia requests must receive a valid Inertia response, however a plain JSON response was received.

хотя локально он правильно перенаправляется на /destination.

🤔 А знаете ли вы, что...
Laravel предоставляет механизмы для работы с кешированием и управления сеансами пользователей.


114
1

Ответ:

Решено

РЕШЕНО!

Кажется, проблема заключалась в обслуживании веб-сайта через Интернет по протоколу https, в то время как он работал на сервере, прослушивающем порт 80 с использованием http. Я использовал прокси-менеджер nginx, чтобы добавить сертификат и зашифровать трафик, но, похоже, это вызвало проблемы с InertiaJS.

Я создал самозаверяющий сертификат для веб-сайта, который может использовать и прослушивать порт 443, с помощью этого руководства, и я настроил Nginx Proxy Manager на перенаправление порта 443 вместо 80, и теперь он перенаправляется правильно.

Я предполагаю, что он подумал, что содержит недопустимый ответ Inertia, потому что возвращенный заголовок location содержал URL-адрес http веб-сайта вместо https.