Использование базового пути в Laravel 5 (Lumen)

Я использую laravel в проекте. На моей локальной машине сервер, к которому у меня есть доступ, просто

laraveltest.dev. Когда я открываю этот URL-адрес, проект работает нормально и без проблем.

Однако, когда я загружаю это на тестовый сервер, где материал находится в подфайле, например: laraveltest.de/test2/. Общая папка находится по адресу laraveltest.de/test2/public/, но при вызове laraveltest.de/test2/public приложение всегда возвращает ошибку 404.

Я подумал, что это может быть из-за базового пути, поэтому я сделал следующее в bootstrap/app.php

$app = new Laravel\Lumen\Application(
    realpath(__DIR__.'/../') . env('APP_BASE_PATH')
);

где env('APP_BASE_PATH') — подпапка.

Итак, app->basePath() возвращает /var/www/laraveltest/test2/public. Однако, когда сейчас открывается

laraveltest.de/test2/public Я всегда получаю ошибку 404, и я не знаю, почему. Что я делаю не так?


person Musterknabe    schedule 28.05.2015    source источник
comment
что в корневой папке? я бы не стал манипулировать файлами laravel. Я думаю, может быть решение с помощью htaccess   -  person nozzleman    schedule 28.05.2015
comment
Вы можете увидеть корневую папку здесь github.com/laravel/lumen. app.php в папке начальной загрузки. предназначен для модификации   -  person Musterknabe    schedule 29.05.2015
comment
Простое решение: stackoverflow.com/questions/30740023/   -  person w3spi    schedule 12.06.2015


Ответы (3)


Вам не нужно изменять basePath, за исключением случаев, когда вы используете собственную структуру приложения для папок. Типа вот так:

bootstrap
├── app.php
└── autoload.php
config
├── app.php
├── auth.php
├── cache.php
├── compile.php
[...]
src
└── Traviola
    ├── Application.php
    ├── Commands
    │   └── Command.php
    ├── Console
    │   ├── Commands
    [...]

Итак, в вашем случае все, что вам нужно сделать, это:

  • Проверьте конфигурацию .htaccess. Позволяет ли сервер файлу .htaccess переопределять конкретную конфигурацию пути?

  • Проверьте свой файл public/index.php. Измените эту строку:


/*
|---------------------
| Run The Application
|---------------------
|
| Once we have the application, we can handle the incoming request
| through the kernel, and send the associated response back to
| the client's browser allowing them to enjoy the creative
| and wonderful application we have prepared for them.
|
*/

$app->run();

// into something like this
$app->run($app['request']);

Надеюсь это поможет.

Дополнительный

Если вам интересно, как Lumen не работает в подпапке. Вы можете увидеть Laravel\Lumen\Application::getPathInfo() строку 1359. Чтобы Lumen работал во вложенной папке, измените этот метод, просто создайте класс, расширяющий Laravel\Lumen\Application.

<?php namespace App;

use Laravel\Lumen\Application as BaseApplication;

class Application extends BaseApplication
{
    /**
     * Get the current HTTP path info.
     *
     * @return string
     */
    public function getPathInfo()
    {
        $query = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : '';

        return '/'.ltrim(
            str_replace(
                '?'.$query,
                '',
                str_replace(
                    rtrim(
                        str_replace(
                            last(explode('/', $_SERVER['PHP_SELF'])),
                            '',
                            $_SERVER['SCRIPT_NAME']
                        ),
                    '/'),
                    '',
                    $_SERVER['REQUEST_URI']
                )
            ),
        '/');
    }
}

Затем в вас bootstrap/app.php измените это:

/*
|------------------------
| Create The Application
|------------------------
|
| Here we will load the environment and create the application instance
| that serves as the central piece of this framework. We'll use this
| application as an "IoC" container and router for this framework.
|
*/

$app = new App\Application(
    realpath(__DIR__.'/../')
);

После этого вам не нужно менять файл public/index.php, просто оставьте его по умолчанию:

/*
|---------------------
| Run The Application
|---------------------
|
| Once we have the application, we can handle the incoming request
| through the kernel, and send the associated response back to
| the client's browser allowing them to enjoy the creative
| and wonderful application we have prepared for them.
|
*/

$app->run();
person krisanalfa    schedule 29.05.2015
comment
Спасибо! Штука с $app['request'] сработала. Однако мои маршруты фактически не работают. Индексная страница работает, но когда я вызываю другую страницу, я получаю сообщение об ошибке 404 (не от laravel, а от apache). Это маршрут $app->get('/post/tag/{tag}', 'App\Http\Controllers\PostController@getPostsByTag');, который нормально работает на локальной машине. - person Musterknabe; 29.05.2015
comment
Отрицательный. Даже с дополнительными маршрутами не работают вложенные папки. :/ - person Musterknabe; 29.05.2015
comment
Ваш веб-сервер Apache был неправильно настроен. Прочтите эту статью. И убедитесь, что ваш сервер загружает mod_rewrite. - person krisanalfa; 29.05.2015
comment
Спасибо. Я позвоню своему администратору сервера и свяжусь с вами - person Musterknabe; 29.05.2015
comment
Хорошо, это была ошибка. По умолчанию на сервере AllowOverride установлено значение None. Он изменил его для сайта на All - person Musterknabe; 29.05.2015
comment
Да, теперь работает, поэтому принял ваш ответ. Спасибо :) - person Musterknabe; 29.05.2015

протестировано с Lumen 5.4 / apache / FPM/FastCGI:

структура папок:

/api
├── index.php
├── .htaccess
/lumen-api/
├── app
├── bootstrap
..

Веб-корень: / URL-адрес: http://www.domain.dev/api

скопировать файлы из каталога /lumen-api/public в /api

изменить /api/index.php:

1) адаптировать путь к каталогу с загрузкой lumen

$app = require __DIR__.'/../lumen-api/bootstrap/app.php';

2) исправить неправильный базовый URL добавить это после "$app = require __DIR_....", чтобы исправить неправильный базовый URL /vendor/symfony/http-foundation/Request.php:protected function prepareBaseUrl()

$_SERVER['SCRIPT_NAME']='index.php';

3) образец /lumen-api/routes/web.php:

$app->get('/api/', ['as' => 'home',function () use ($app) {
    return $app->version() . " - " . route('home');
}]);

4) Тест http://www.domain.dev/api Результат должен быть:

Lumen (5.4.0) (Laravel Components 5.4.*) - http://www.domain.dev/api

если вы получаете http://www.domain.dev/api/api два раза /api/api - исправление для базового URL из 2) не работает!

person Andreas Heissenberger    schedule 25.01.2017

В моем случае я переместил .htaccess из общего каталога в корневой каталог и создал файл index.php в корне моего проекта, и он выглядит так. Если у вас есть проект laravel, вы можете скопировать его server.php из корня и изменить его имя на index.php.

index.php

<?php

$uri = urldecode(
    parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
);

if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) {
    return false;
}

require_once __DIR__.'/public/index.php';
person Mohsin Raza    schedule 22.11.2018