Laravel应用部署至子目录后路由异常问题求助
解决Laravel部署到服务器子目录后的路由问题
我之前也碰到过一模一样的情况——本地跑的好好的Laravel应用,部署到服务器的子目录里就各种路由404或者跳转错位,折腾了好一会儿才捋清楚问题根源。结合你提到已经调整过public目录的.htaccess,我来分享下完整的排查和稳定解决思路,帮你把临时方案替换成更可靠的配置:
第一步:先确认部署结构是否正确
很多人踩坑都是因为部署路径没搞对:
- 正确的做法是:把Laravel项目的整个目录放到服务器的非web根目录(比如
/var/www/myapp),然后把web服务器(Apache/Nginx)的根目录指向Laravel的public文件夹。如果是子目录部署,那web服务器的子目录映射要指向/var/www/myapp/public,而不是把整个Laravel项目直接扔到web根的子目录里。 - 举个例子:如果你的临时域名子目录是
https://temp-domain.com/laravel-app,那服务器上应该是/var/www/laravel-app放整个Laravel项目,然后配置Apache把/laravel-app这个请求路径映射到/var/www/laravel-app/public。
第二步:调整Laravel的核心配置
- 修改
.env文件:把APP_URL改成带子目录的完整地址,比如:APP_URL=https://temp-domain.com/laravel-app - 清除配置缓存:部署后一定要执行这几个命令,避免旧配置残留:
php artisan cache:clear php artisan route:clear php artisan config:clear
第三步:修正Public目录的.htaccess
你已经修改了这个文件,但大概率是没加上RewriteBase的配置。针对子目录场景,正确的.htaccess应该是这样(把/laravel-app/替换成你的实际子目录):
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # 关键:设置RewriteBase为你的子目录路径 RewriteBase /laravel-app/ # 处理Authorization请求头 RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # 移除URL末尾的斜杠(如果不是目录) RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # 所有非文件/目录的请求都转发到index.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
第四步:如果用Nginx的话,调整服务器配置
要是你的服务器用的是Nginx,那得在server块里添加子目录的路由规则,替换掉默认的location /配置:
server { # 其他配置(监听端口、域名等)保持不变 # 处理子目录的请求 location /laravel-app { try_files $uri $uri/ /laravel-app/index.php?$query_string; } # PHP文件处理规则 location ~ \.php$ { root /var/www/laravel-app/public; # 指向Laravel的public目录 fastcgi_pass unix:/run/php/php8.2-fpm.sock; # 根据你的PHP版本调整 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } }
最后:检查路由写法
确保你代码里的所有链接都用Laravel的辅助函数生成,比如用route('route-name')或者url('path'),不要写硬编码的绝对路径(比如<a href="/home">)。这样Laravel会自动基于APP_URL的配置加上子目录前缀,避免跳转错误。
如果你的临时解决办法是手动在路由前加子目录,那换成上面的配置后就可以去掉这些硬编码了,后续换域名或者调整子目录也不用改代码。
内容的提问来源于stack exchange,提问作者Basheer Kharoti
相关产品推荐
相关产品推荐

