在 Laravel 5 (Lumen) 中使用基本路径

Posted

技术标签:

【中文标题】在 Laravel 5 (Lumen) 中使用基本路径【英文标题】:Making use of the base path in Laravel 5 (Lumen) 【发布时间】:2015-08-11 06:21:33 【问题描述】:

我在一个项目中使用 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 错误,我不知道为什么。我做错了什么?

【问题讨论】:

根文件夹中有什么?我不会操纵 laravel 文件。我想可能有一个使用 htaccess 的解决方案 这里可以看到根文件夹github.com/laravel/lumenbootstrap文件夹中的app.php是要修改的 简单解决方案:***.com/questions/30740023/… 【参考方案1】:

不需要更改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();

【讨论】:

谢谢! $app['request'] 的东西起作用了。但是,我的路线实际上不起作用。索引页面有效,但是当我调用另一个页面时,我收到 404 错误(不是 laravel 的错误,而是来自 apache 的错误)这是路由 $app-&gt;get('/post/tag/tag', 'App\Http\Controllers\PostController@getPostsByTag'); 在本地机器上正常工作 否定。即使有额外的东西路线也不适用于子文件夹。 :// 您的 Apache Web 服务器配置错误。请阅读this article。并确保您的服务器加载mod_rewrite。 谢谢。我会打电话给我的服务器管理员并回复你 好的,这就是错误。服务器默认将AllowOverride 设置为None。他把网站改成All【参考方案2】:

使用 Lumen 5.4 / apache / FPM/FastCGI 测试:

文件夹结构:

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

网络根目录:/ 网址:http://www.domain.dev/api

将文件从目录/lumen-api/public复制到/api

更改/api/index.php:

1) 使用 lumen bootstrap 调整目录路径

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

2) 修复错误的baseURL 在 "$app = require __DIR_...." 之后添加这个来修复 /vendor/symfony/http-foundation/Request.php 的错误 baseURL: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 - 来自 2) 的 baseURL 修复不起作用!

【讨论】:

【参考方案3】:

在我的例子中,我将 .htaccess 从公共目录移动到根目录,并在我的项目根目录中创建了一个 index.php 文件,它看起来像这样。如果你有一个 laravel 项目,你可以从 root 复制它的 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';

【讨论】:

以上是关于在 Laravel 5 (Lumen) 中使用基本路径的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 在 Lumen 不工作的地方进阶了

在 Lumen 5.7 中使用 Rollbar

Laravel/Lumen 5.3.3:在迁移中覆盖 env 值

Lumen 5.4 与 Laravel 可邮寄

使用 Laravel/Lumen 5.2 和 apache 2.4

在 Lumen (Laravel) 中启用中间件