Laravel项目部署后路由路径错误、静态资源无法加载问题咨询
问题核心成因
你本地运行正常,是因为本地Web配置是根目录直接指向Laravel项目的public文件夹,和默认.htaccess规则、本地APP_URL配置完全匹配;但部署到服务器后你把项目整体放在了Web根下的/app子目录,仍然沿用根目录场景的默认配置,和实际部署结构完全不匹配,才会同时出现路由丢前缀、静态资源加载失败的问题。
两个异常表现的对应触发逻辑:
- 路由跳转为啥丢失
/app前缀:现有重写规则会把所有非文件、非文件夹的请求直接转发到当前目录层级的index.php,没有关联子目录的实际入口路径,导致路由解析时直接把/app这层目录前缀丢掉,最终请求落到Web根目录的缺失文件上,触发404。 - 静态资源加载失败:Laravel生成css、js、视图跳转链接时,默认读取项目内的
APP_URL配置,你没有把本地开发环境的配置改成线上子目录的访问地址,导致所有生成的链接都没带/app前缀,自然找不到对应的静态资源文件。
分步修复方案
- 第一步:修正重写规则配置
打开Web根目录下当前在用的.htaccess,因为项目在/app子目录下,原有的重写规则没有做子目录路径映射,需要替换成适配子目录部署的规则,把所有请求正确导向app/public下的Laravel入口文件:<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # 兼容子目录的授权头传递 RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # 去掉非目录路径的尾部斜杠 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # 把子目录的请求转发到实际的Laravel入口 RewriteCond %{REQUEST_URI} !^/app/public/ RewriteRule ^(.*)$ /app/public/$1 [L] </IfModule> # 禁止目录列表 Options -Indexes # 屏蔽敏感文件访问 <Files ~ "\.(env|json|config.js|md|gitignore|gitattributes|lock)$"> Order allow,deny Deny from all </Files> - 第二步:修正环境配置
进入项目根目录,打开.env配置文件,把APP_URL的值修改为实际的线上访问地址:http://156.0.125.1/app/public。修改完成后在服务器上执行php artisan config:clear命令清空本地缓存的开发环境配置,保证新配置生效。 - 第三步:统一静态资源生成规则
检查项目视图内的静态资源引入路径,不要硬编码写/css/xxx、/js/xxx这类直接指向Web根的绝对路径,统一用Laravel提供的asset()函数生成资源链接,比如写{{ asset('css/app.css') }},生成的链接会自动带上APP_URL里的子目录前缀,不会出现路径丢失的问题。 - 第四步:核对目录权限
确认项目内storage、bootstrap/cache两个目录的操作权限对Web运行用户(通常是www-data)开放,避免因为权限不足导致路由解析、缓存写入失败。
内容的提问来源于stack exchange,提问作者Juststartedcoding
相关产品推荐
相关产品推荐

