资产未引用到公共文件夹(Laravel)

26

在我的Laravel项目中,我有一个public文件夹,并且其中包含一些js和css文件。

我正在使用asset函数,尽管它是引用公共文件夹,但我的文件没有加载到页面上。

我正在使用以下代码进行加载(这只是一个示例,还有更多文件):


<link href="{{ asset('css/style.css') }}" rel="stylesheet">

在浏览器的控制台上,我得到了类似以下的信息:

无法加载资源:服务器响应404(未找到) http://localhost:8000/css/style.css

我尝试还原最后一次提交,但没有成功。尝试更改为URL::asset()函数,但仍然失败。我尝试了以下链接中的所有方法:http://laravel.io/forum/09-17-2014-problem-asset-not-point-to-public-folder?page=1,并最终成功。

请问,可以给我一点帮助吗?

谢谢!


你使用什么环境来访问你的项目?本地,托管服务器等? - jackel414
尝试阅读/storage/logs下的Apache/Nginx或Laravel日志,您可能会在那里找到更多信息。 - Victor Rudkov
你的 Laravel 版本是多少? - Mohammad Nurul Huda Rimon
你是否在使用Elixir进行资产编译?如果是,你的gulpfile是什么样子的? - JJWesterkamp
抱歉等待时间太长了。它在我的本地主机上。我正在使用XAMPP。所以,到目前为止我做了什么: 我曾经在我的httpd.conf文件中有一个虚拟主机,我将其删除了,但没有起作用。 我还尝试过localhost:8000/public/,但也没有起作用。 我从laravel创建了一个新项目,并将其他项目的所有内容复制到这个项目中,然后它就可以工作了。哈哈。但是另一个项目出了什么问题?我正在使用版本5.0.16。不使用Elixir。感谢您的回答! - Gabriel Augusto
尝试使用我的解决方案,它可以在任何地方运行。查看链接 https://stackoverflow.com/questions/25222509/laravel-not-detecting-files-from-public-folder/69517681#69517681 - pankaj
12个回答

27

我遇到了同样的问题。这是由于将 .htaccess 文件从 public 移动到项目根目录,以便提供 localhost/project 而不是 localhost/project/laravel。并且在资产中也需要使用 public:

<link href="{{ asset('public/css/app.css') }}" rel="stylesheet">

或者,您可以修改 /Illuminate/Foundation/helpers.php 中的 asset 函数

if (! function_exists('asset')) {
    /**
     * Generate an asset path for the application.
     *
     * @param  string  $path
     * @param  bool    $secure
     * @return string
     */
    function asset($path, $secure = null)
    {
        return app('url')->asset("public/".$path, $secure);
    }
}

前面的方法不是一个好的方式。如果有设置资产路径的配置,这将会更容易。


1
如果您使用 Laravel Mix,请使用 mix() 而不是 asset()。 - mercury

23
在您的env中添加:
ASSET_URL=public 
或者
ASSET_URL=public/
ASSET_URL=/public

你需要哪一个,你就可以做到...


2
对我来说,ASSET_URL=http://localhost/project_name/public 可以工作。ASSET_URL=public或其他不会生成完整路径,它从public开始,如public/assets/css/main.css。应用程序URL /基本URL未包含。为什么? - Satish
你不需要添加这些内容到本地的Laravel项目中,它可以正常工作。但在一些共享主机上可能需要添加这些内容。使用以下方式来引用资源即可:<link href="{{ asset('css/style.css') }}" rel="stylesheet"> - Sahilbalgotra100
1
没有/public,它在本地机器上使用XAMPP无法工作。我会尝试在正在运行的托管服务器上测试它。 - Satish
如果简单的 asset('css/style.css') 无法正常工作,则尝试将我提供的上面那个解决方案添加到 .env 文件中,它可以正常工作。不要全部添加,一个一个地尝试。 - Sahilbalgotra100
@Sahilbalgotra100 把<link href="{{ asset('css/style.css') }}" rel="stylesheet">放在哪个文件中? - Umair

7

在您安全且成功地设置了.htaccess像这样)之后,您的方法将按预期工作:

<link href="{{ asset('css/style.css') }}" rel="stylesheet">

请注意,所有客户端URL请求(包括图片、JavaScript / CSS文件、JSON)在设置.htaccess后都会受到重写规则的影响。

还要注意,在您看到更改后可能需要一段时间。缓存可能会干扰这些更改。因此,请确保清除Laravel缓存:

在Shell中逐个运行以下命令:

php artisan cache:clear
php artisan route:cache
php artisan config:cache
php artisan view:clear

确保在浏览器设置中暂时禁用缓存:

在 Chrome 浏览器中:打开开发者工具 > 打开网络选项卡 > 选择 “禁用缓存”

其他浏览器:搜索如何执行此操作。


运行这些命令后,我得到了以下错误:(2/2) QueryException SQLSTATE[42S02]: 基本表或视图不存在:1146 表 'arcade_oms.oc_order' 不存在 (SQL: SELECT (SELECT COUNT(order_id) FROM .oc_order WHERE date_added <= '2021-02-15' AND date_added >= '2021-02-15' AND order_status_id = '1') AS pending - Siraj Ali

6
在我的情况中,在.env文件中我尝试过。
ASSET_URL=public

在使用双斜杠或者单独使用时,所有相关的SO答案都没有帮助到我,之后我打开了我的旧项目并看到了这一点。最终这对我有用(当然,在清除视图和缓存后)。

ASSET_URL="${APP_URL}"

我在谈论本地主机端


2
将这个代码添加到你的 .htaccess 文件中。
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ /public/$1 [L,QSA]

它会解决你的问题。肯定的。

不工作:http://127.0.0.1:8000/invoice/2021-07-28/28-07-21 IFE000.pdf。这里缺少public。当我添加public时,它就可以工作了。 - pankaj

2
<link href="{{ asset('/css/style.css') }}" rel="stylesheet">

试试这个


1

由于您已将 .htaccess 文件移动到根文件夹,您必须更改在任何地方使用的资产 URL。URL 应该如下所示:

<link href="{{ asset('public/css/style.css') }}" rel="stylesheet">

或者,您可以在.env文件中将ASSET_URL设置为“public”,

ASSET_URL=http://localhost/projectname/public

1
在我的情况下,我在 Laravel 项目的环境文件 (.env) 中进行了这些更改。
APP_URL=https://sitename.com
ASSET_URL=https://sitename.com/public

在本地环境中一切都正常运行... 但是当我将我的 Laravel 项目转移到生产环境时,资源无法正确加载... 然后这个方法帮助我解决了这个问题...


答案已经给出,你的回答有什么新意? - nageen nayak
我在Laravel 10中遇到了这个问题...只是想分享一下...它有什么问题吗? - Rishigesan

0

抱歉我的英语不好,我在使用mike42/escpos-php时遇到了同样的问题,因为在xampp中

我将其移动到zlib.output_compression=on

正确的方法是

zlib.output_compression=off

并且资产再次工作


0

stlye.css正在从公共文件夹加载和工作。 不要忘记添加rel="stylesheet"

<link href="{{ asset('/css/style.css') }}" rel="stylesheet">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接