Laravel本地环境public目录资源无法访问问题求助
Laravel本地启动后资源URL带public导致404的解决方案
问题说明
从服务器下载的Laravel 8.6项目在服务器端运行正常,但本地通过php artisan serve启动后,浏览器加载资源时大量报404错误,示例错误链接:http://127.0.0.1:8000/public/assets/front-end/vendor/tiny-slider/dist/tiny-slider.css net::ERR_ABORTED 404 (Not Found)
手动去掉URL中的public前缀即可正常访问资源,但项目内约300处资源链接分散在不同文件中,无法逐一修改。
已尝试但无效的操作:
- 修改根目录及public目录的
.htaccess配置 - 调整
httpd.conf和httpd-vhosts.conf的DocumentRoot指向public目录 - 修改
.env文件中的APP_ENV、APP_DEBUG、APP_URL等参数 - 测试相关社区解决方案
- 开放Windows系统文件夹访问权限
- 在public目录内新建public子目录并迁移资源(引发其他路径问题已放弃)
- 更换WAMP环境,降级Laravel、PHP、XAMPP版本
- 修改
filesystem.php中的磁盘配置
可行解决方案
方案1:全局中间件重写URL
通过中间件自动移除请求URL中的public前缀,实现自动重定向:
- 生成中间件文件:
php artisan make:middleware RemovePublicPrefix
- 编辑
app/Http/Middleware/RemovePublicPrefix.php的handle方法:
public function handle(Request $request, Closure $next) { $requestUri = $request->getRequestUri(); if (strpos($requestUri, '/public') === 0) { return redirect(substr($requestUri, 7)); } return $next($request); }
- 在
app/Http/Kernel.php的$middleware数组中注册该中间件:
protected $middleware = [ // 保留原有中间件 \App\Http\Middleware\RemovePublicPrefix::class, ];
方案2:自定义服务器入口文件
通过修改或新增服务器入口文件,直接处理带public前缀的请求:
- 在项目根目录创建
server.php文件,内容如下:
<?php $uri = urldecode(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)); // 移除URL中的public前缀 if (strpos($uri, '/public') === 0) { $uri = substr($uri, 7); } // 优先返回静态资源 if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) { return false; } require_once __DIR__.'/public/index.php';
- 使用以下命令启动本地服务器:
php -S 127.0.0.1:8000 server.php
方案3:创建符号链接(Windows环境)
通过符号链接映射路径,让带public前缀的请求指向实际资源目录:
打开命令提示符(以管理员身份),进入项目根目录的public文件夹,执行:
mklink /D public .
此命令会在public目录下创建一个名为public的符号链接,指向当前目录(即项目的public目录),从而让/public/assets/...的请求正确加载资源。
内容的提问来源于stack exchange,提问作者Hamza oda
相关产品推荐
相关产品推荐

