Laravel子域名部署添加.htaccess跳转public目录遇HTTP ERROR 500求助
我来帮你一步步排查这个问题,Laravel部署子域名时遇到500错误,大概率是.htaccess配置、权限或者服务器环境的问题,咱们一个个来:
先检查根目录的.htaccess文件是否正确
很多人在这里写错规则导致500。你的Laravel项目根目录(不是public子目录)的.htaccess应该是这样的,不要混入public目录里的重写规则:<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)$ public/$1 [L] </IfModule>如果之前复制了public目录的.htaccess内容到根目录,两种规则冲突肯定会触发服务器错误。
检查Laravel核心目录的权限
500错误经常和权限不足挂钩,尤其是storage和bootstrap/cache这两个目录,服务器需要读写权限才能正常运行Laravel。
如果你有SSH权限,执行这两个命令:chmod -R 755 storage bootstrap/cache chown -R www-data:www-data storage bootstrap/cache # Apache环境用这个,Nginx环境换成nginx用户没有SSH权限的话,通过主机面板的文件管理器,把这两个目录的权限设为755,目录下的文件设为644。
查看服务器错误日志,定位具体原因
HTTP 500是通用错误,看不到具体细节,必须看日志才能精准解决问题:- Apache服务器的日志一般在
/var/log/apache2/error.log(Linux系统),或者主机面板的「错误日志」模块里; - Nginx服务器的日志在
/var/log/nginx/error.log。
日志里会明确告诉你是.htaccess语法错误、权限不足还是代码层面的报错,这是最关键的一步。
- Apache服务器的日志一般在
确认子域名的文档根目录设置
确保你的子域名指向的是Laravel项目的根目录,而不是public目录。因为我们要通过根目录的.htaccess重定向到public,如果直接把文档根设为public,根目录的.htaccess就起不到作用,反而可能引发冲突。检查PHP版本是否兼容
不同版本的Laravel对PHP版本有硬性要求,比如Laravel 9需要PHP 8.0及以上,Laravel 10需要PHP 8.1及以上。如果服务器PHP版本太低,直接会触发500错误。你可以在项目根目录新建一个phpinfo.php文件,内容写<?php phpinfo(); ?>,访问这个文件查看PHP版本,再对照Laravel官方要求确认。清理Laravel缓存
有时候缓存的旧配置会导致部署问题,尤其是你修改了APP_URL之后。执行以下命令清理缓存:php artisan config:clear php artisan cache:clear php artisan route:clear没有SSH权限的话,手动删除
bootstrap/cache目录下的所有文件(保留.gitignore即可)。
内容的提问来源于stack exchange,提问作者Nuno

