在 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' => 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 添加到资产路径的主要内容,如果未能解决你的问题,请参考以下文章