Laravel 5.8 url()函数无协议前缀致重定向异常求助
Hey there, sorry you're stuck with this weird redirect mess! Let's walk through some practical fixes tailored to your Laravel 5.8 + Homestead setup:
1. 先清配置缓存(最常见的坑)
Laravel会缓存配置值当你运行php artisan config:cache后,哪怕你后来改了.env,缓存没清的话新配置也不会生效。哪怕你记不清有没有跑过缓存命令,先试试这几步:
php artisan config:clear php artisan route:clear php artisan view:clear
执行完这些后刷新你的/info页面,看看url('/')是不是正常返回http://project.test了。
2. 强制给URL生成器指定根地址
如果清缓存没用,你可以直接强制URL生成器用你设置的APP_URL值。打开app/Providers/AppServiceProvider.php,在boot()方法里加这段代码:
public function boot() { // 强制URL生成器使用配置的APP_URL $this->app['url']->forceRootUrl(env('APP_URL')); // 如果你需要强制用HTTP(Homestead有时候会在某些场景下默认识别成HTTPS) $this->app['url']->forceScheme('http'); }
保存后刷新页面再测试,这会覆盖任何请求上下文导致的URL生成异常。
3. 检查Homestead的Nginx配置(请求头问题)
Homestead用Nginx反向代理请求到PHP-FPM,有时候X-Forwarded-Proto请求头没设置对,会搞乱Laravel的URL识别逻辑。
你可以登录Homestead虚拟机,找到站点的Nginx配置(一般在/etc/nginx/sites-available/project.test),确保配置里有这些行:
location / { try_files $uri $uri/ /index.php?$query_string; # 没加的话补上这两个请求头 proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; }
改完后重启Nginx:
sudo service nginx restart
再回到Laravel页面测试看看。
4. 调试请求对象的根URL
在你的/info路由里加一行调试代码,看看请求对象的根URL是什么:
echo request()->root(); // 正常应该返回http://project.test
如果这个返回的是://project.test,说明Laravel没从请求里正确识别协议(http),那用步骤2里强制设置协议的方法就能解决。
5. 检查.env文件有没有隐藏字符
有时候复制粘贴到.env里会带入看不见的空格或特殊字符,仔细检查APP_URL=http://project.test这一行,确保前后没有空格,http://的格式完全正确。
内容的提问来源于stack exchange,提问作者Irimi

