在 Laravel 中将 Public 添加到资产路径

Posted

技术标签:

【中文标题】在 Laravel 中将 Public 添加到资产路径【英文标题】:Add Public to asset path in Laravel 【发布时间】:2015-12-24 22:36:26 【问题描述】:

我想在共享主机中安装 laravel,我按照这里的步骤 https://***.com/a/28449523 但我的资产路径不包括公共目录

而不是这个

<link href='http://example.com/public/assets/css/style.css' type='text/css' media='all' />

我收到了

<link href='http://example.com/assets/css/style.css' type='text/css' media='all' />

如何在不更改任何核心类的情况下更改资产文件夹的目录(将公共添加到资产)?

【问题讨论】:

您遵循的教程是用于删除公共部分。如果你真的做到了,你已经删除了,Public,不是吗?如果你的主机有cpanel,你只需要点击Softaculous,安装是自动的,它会默认安装在公共段中 但我的资产路径不包含我希望在使用asset() 函数时包含的公用文件夹。 看来不改变核心类是无法实现的。 尝试更改.htaccess文件 【参考方案1】:

在 Laravel 5.7.14 之前

看看Illuminate\Routing\UrlGenerator 类及其asset($path, $secure = null) 方法。这个类被url 键放入容器中。你可以做的是:

    添加您自己的类,扩展UrlGenerator; 将asset($path, $secure = null) 方法添加到您自己的类中,使其返回您需要的任何内容; 创建服务提供者并在config/app.php注册; 在您的服务提供者的register() 方法中,绑定您的新类 通过url 键到容器。

这样,你根本不用接触核心文件,你的 Laravel 应用程序仍然是更新友好的。

Laravel 5.7.14 及更高版本更新

正如其他答案所述,有 ASSET_URL .env 选项,这使得更改公共路径变得更加容易。 Laravel 在 Laravel 5.7.14 中引入了它,该版本在我最初回答后大约 3 年发布。

【讨论】:

对不起,通过 url 键将新类绑定到容器是什么意思?我怎么做?我可以在 serviceProvider 上这样做而不是创建一个新的吗? 这可以通过在 .env 中定义 ASSET_URL 来轻松完成 ASSET_URL 是在 2018 年底发布的 Laravel 5.7.14 中引入的。这个问题是我在 2015 年提出并回答的。我会更新答案,因为很多人只是看选择答案。 @RoboRobok 如果有管理面板 URL,例如 www.example.com/admin,则 ASSET_URL 不起作用【参考方案2】:

一个相对简单的 hack 是在 \vendor\laravel\framework\src\Illuminate\Routing\UrlGenerator.php 中的asset() 函数的返回值中添加文件夹

public function asset($path, $secure = null)

    if ($this->isValidUrl($path)) 


        return $path;
    

    // Once we get the root URL, we will check to see if it contains an index.php
    // file in the paths. If it does, we will remove it since it is not needed
    // for asset paths, but only for routes to endpoints in the application.
    $root = $this->assetRoot
                ? $this->assetRoot
                : $this->formatRoot($this->formatScheme($secure));

    // Following 2 lines were added
    if($_SERVER['REMOTE_ADDR'] != '127.0.0.1')
        $root .= '/public';

    return $this->removeIndex($root).'/'.trim($path, '/');

请注意,我已根据条件将 public 添加到返回值。所以也可以这样做。

【讨论】:

【参考方案3】:

在您的 .env 文件中添加 ASSET_URL=public 并运行 php artisan config:cache

【讨论】:

在 laravel 5.8 中工作 运行 php artisan config:cache 导致 issue 我正在使用 Laravel 8。谢谢@Abid_015,这对我有用。 在 Laravel 8 中不适合我【参考方案4】:

对于最新版本的 Laravel - Laravel 5.8,config/app.php 中有一个名为 asset_url 的键。该键的值决定了 asset() 方法返回的值。通常,如果您的所有资产文件夹都在默认位置(此默认位置是 Laravel 安装根目录下的 public 文件夹,则应该将此键的值设置为您网站的基本 url )。

例如,如果您的网站 url 是“https://www.example.com”,并且您想访问根文件夹下的资产路径 public/assets/css/sample.css,请在 config/ 中设置asset_url app.php 像这样:

'asset_url' =&gt; env('ASSET_URL', 'https://www.example.com'),

并像这样使用资产函数:

asset('assets/css/sample.css')

然后,通过在 laravel 安装文件夹中运行它来重新配置缓存:

php artisan config:cache

这将更新 bootstrap/cache/config.php 文件。如果您检查您的浏览器,为您的资产生成的 url 将是“https://www.example.com/assets/css/sample.css”。

获得有效 url 的一种方法是:“https://www.example.com/public/assets/css/sample.css”是在您现有的公用文件夹中创建另一个名为 public 的文件夹 - 这对我来说是不直观的。 但是,如果这样做,则在使用资产功能时必须包含此路径:

asset('public/assets/css/sample.css')

【讨论】:

以上是关于在 Laravel 中将 Public 添加到资产路径的主要内容,如果未能解决你的问题,请参考以下文章

资产不引用公用文件夹(Laravel)

我应该在 Laravel 5 中将 JS 存储在哪里?

如何在 Laravel 5 中将自定义配置文件添加到 app/config?

在 laravel 中将数据从外键添加到数据库中

laravel 资产()方法不返回 https

在laravel中将虚拟数据添加到“联接表”的最佳方法是什么?