Предположим, у вас есть домен my-laravel-app.ru. Как можно настроить размещение сайта на Laravel так, чтобы он был доступен по адресу my-laravel-app.ru/laravel/? Структура папок выглядит следующим образом: <pre><code>public_html -- laravel ---- public ---- app ---- .htaccess ---- ...</code></pre> В файле public_html/laravel/.htaccess у вас прописаны следующие строки: <pre><code><IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)$ public/$1 [L] </IfModule></code></pre> Однако при попытке открыть my-laravel-app.ru/laravel/ вы получаете ошибку 404 от Laravel (с учетом, что это именно стилизованная ошибка от самого Laravel, а не от веб-сервера). Похоже, что Laravel не может корректно обработать роутинги по какой-то причине. Следует отметить, что при размещении всех файлов Laravel в директории public_html сайт работает правильно через my-laravel-app.ru. Как можно решить эту проблему с доступом к Laravel по вложенному URL?
Чтобы установить Laravel в подпапке вашего веб-сервера и обеспечить доступ к нему по адресу `my-laravel-app.ru/laravel/`, необходимо правильно настроить маршруты и конфигурацию вашего приложения. Вот шаги, которые помогут вам это сделать: ### 1. Настройка структуры папок У вас уже есть правильная структура папок, но убедитесь, что файлы Laravel находятся в нужных директориях: ``` public_html -- laravel ---- public ---- app ---- routes ---- ... ``` ### 2. Настройка `.htaccess` Файл `.htaccess` в папке `public_html/laravel/` нужно настроить следующим образом: ```apache <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /laravel/ RewriteRule ^(.*)$ public/$1 [L] </IfModule> ``` ### 3. Настройка `index.php` Поскольку Laravel выдает 404 ошибки, очень вероятно, что проблема связана с тем, что Laravel не знает, где ему искать свои ресурсы. Вам нужно отредактировать файл `index.php`, который находится в папке `public` вашего Laravel-приложения. Откройте файл `public/index.php` и измените следующие строки: ```php require __DIR__.'/../vendor/autoload.php'; $app = require_once __DIR__.'/../bootstrap/app.php'; ``` Замените на: ```php require __DIR__.'/../../vendor/autoload.php'; $app = require_once __DIR__.'/../../bootstrap/app.php'; ``` Таким образом, вы укажете Laravel, что директория `vendor` и `bootstrap` находятся две папки вверх от текущей директории `public`. ### 4. Настройка конфигурации URL Вам также нужно изменить некоторые настройки в файле `.env`, чтобы Laravel знал, что он работает в подпапке. Убедитесь, что `APP_URL` в файле `.env` настроено следующим образом: ``` APP_URL=http://my-laravel-app.ru/laravel ``` ### 5. Проверка доступа к статическим ресурсам Если у вас есть статические ресурсы (например, CSS, JS, изображения и т.д.), убедитесь, что они загружаются правильно. Для этого убедитесь, что все ссылки к ним используют `{{ asset('path/to/resource') }}`. ### 6. Проверьте права на папки Убедитесь, что у вашего веб-сервера есть права доступа к нужным папкам и что все зависимости загружены корректно. Выполните команду composer: ```bash composer install ``` ### 7. Тестирование Теперь попробуйте снова открыть ваш сайт по адресу `http://my-laravel-app.ru/laravel/` и проверьте, работает ли всё корректно. Если вы всё сделали правильно, Laravel должен отображать главную страницу приложения. Если после всех этих изменений все еще возникают проблемы, проверьте логи вашего веб-сервера и логи Laravel (`storage/logs/laravel.log`) на наличие ошибок. Это может дать дополнительные подсказки о том, что не так настроено.
мне кажется тебе нужно не на уровне nginx это делать, а на уровне роутов ларавель. в ларавель есть роуты api, для этих маршрутов все идет черед префикс /api. нужно по аналогии реализовать /laravel (ну а все остальные варианты доступа убрать)
Например вот такой провайдер (ну или можно в стандартном провайдере, но я бы там закоментил просто стандартный вариант, а кастом в новый провайдер унес)
<?php namespace App\Providers; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Route; class MyRouteServiceProvider extends ServiceProvider { /** * The path to your application's "home" route. * * Typically, users are redirected here after authentication. * * @var string */ public const HOME = '/laravel/home'; public function boot(): void { $this->routes(function () { Route::middleware('laravel') ->prefix('laravel') ->group(base_path('routes/laravel.php')); }); } }
и подключить его в config/app.php
'providers' => ServiceProvider::defaultProviders()->merge([ /* * Application Service Providers... */ App\Providers\MyRouteServiceProvider::class, ])->toArray(),
мне кажется тебе нужно не на уровне nginx это делать, а на уровне роутов ларавель. в ларавель есть роуты api, для этих маршрутов все идет черед префикс /api. нужно по аналогии реализовать /laravel (ну а все остальные варианты доступа убрать)
Например вот такой провайдер (ну или можно в стандартном провайдере, но я бы там закоментил просто стандартный вариант, а кастом в новый провайдер унес)
<?php namespace App\Providers; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Route; class MyRouteServiceProvider extends ServiceProvider { /** * The path to your application's "home" route. * * Typically, users are redirected here after authentication. * * @var string */ public const HOME = '/laravel/home'; public function boot(): void { $this->routes(function () { Route::middleware('laravel') ->prefix('laravel') ->group(base_path('routes/laravel.php')); }); } }
и подключить его в config/app.php
'providers' => ServiceProvider::defaultProviders()->merge([ /* * Application Service Providers... */ App\Providers\MyRouteServiceProvider::class, ])->toArray(),