Использование 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 предоставляет механизмы для работы с кешированием и управления сеансами пользователей.
РЕШЕНО!
Кажется, проблема заключалась в обслуживании веб-сайта через Интернет по протоколу https, в то время как он работал на сервере, прослушивающем порт 80 с использованием http. Я использовал прокси-менеджер nginx, чтобы добавить сертификат и зашифровать трафик, но, похоже, это вызвало проблемы с InertiaJS.
Я создал самозаверяющий сертификат для веб-сайта, который может использовать и прослушивать порт 443, с помощью этого руководства, и я настроил Nginx Proxy Manager на перенаправление порта 443 вместо 80, и теперь он перенаправляется правильно.
Я предполагаю, что он подумал, что содержит недопустимый ответ Inertia, потому что возвращенный заголовок location
содержал URL-адрес http веб-сайта вместо https.