Как установить Laravel в подпапке вашего веб-сервера?

Предположим, у вас есть домен 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>&lt;IfModule mod_rewrite.c&gt;
   RewriteEngine On
   RewriteRule ^(.*)$ public/$1 [L]
&lt;/IfModule&gt;</code></pre>

Однако при попытке открыть my-laravel-app.ru/laravel/ вы получаете ошибку 404 от Laravel (с учетом, что это именно стилизованная ошибка от самого Laravel, а не от веб-сервера). Похоже, что Laravel не может корректно обработать роутинги по какой-то причине. 

Следует отметить, что при размещении всех файлов Laravel в директории public_html сайт работает правильно через my-laravel-app.ru. 

Как можно решить эту проблему с доступом к Laravel по вложенному URL?
  • 10 октября 2024 г. 16:54
Ответы на вопрос 3
Чтобы установить 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(),
Похожие вопросы