Certbot配置Apache后子目录Laravel项目出现500错误排查
嘿,我看到你主站的HTTPS配置没问题,但子目录下的Laravel项目访问public目录时遇到了500错误,日志还提示vendor文件里有意外的?。结合这些信息,我整理了几个实用的排查步骤,你可以一步步来:
1. 调整Laravel public目录的.htaccess配置
Laravel默认的public/.htaccess是为根目录部署设计的,放在子目录下时,重写规则的Base路径需要适配。打开/var/www/html/laravel/public/.htaccess,修改成下面这样:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # 关键:指定当前子目录的Base路径 RewriteBase /laravel/public/ # 保留Authorization Header(HTTPS环境下这个很重要) RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # 如果请求的文件/目录存在,直接访问;否则转发到index.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
保存后重启Apache:sudo systemctl restart apache2,再测试访问看看。
2. 确认Apache的mod_rewrite启用,且子目录允许.htoverride生效
首先检查mod_rewrite是否开启,Ubuntu 16.04下执行:
sudo a2enmod rewrite
如果提示已启用就跳过,否则重启Apache让它生效。
然后打开你的SSL虚拟主机配置文件(一般在/etc/apache2/sites-available/你的站点.conf),确保Laravel的public目录允许.htaccess覆盖配置,在<VirtualHost *:443>块里添加:
<Directory /var/www/html/laravel/public> Options Indexes FollowSymLinks MultiViews AllowOverride All Require all granted </Directory>
修改后记得重启Apache。
3. 修复Laravel目录的权限问题
权限问题是500错误的常客,尤其是HTTPS环境下Apache的权限检查更严格。执行以下命令设置正确的权限:
# 让Apache用户(www-data)拥有项目目录权限 sudo chown -R www-data:www-data /var/www/html/laravel # 给目录和文件设置合理的读写权限 sudo chmod -R 755 /var/www/html/laravel # 给storage和bootstrap/cache目录写入权限(Laravel必需) sudo chmod -R 775 /var/www/html/laravel/storage /var/www/html/laravel/bootstrap/cache
4. 解决日志里的"意外的?"问题
日志提到vendor目录文件有意外的?,大概率是这两个原因:
- 文件编码带BOM:如果vendor里的PHP文件是带UTF-8 BOM的编码,PHP解析时会把BOM当成
?字符。你可以用file命令检查:
如果显示file /var/www/html/laravel/vendor/具体报错的文件.phpUTF-8 Unicode (with BOM),最简单的办法是重新执行composer install,让Composer重新生成干净的vendor文件(确保你的Composer环境正常)。 - 重写规则解析异常:如果之前的.htaccess配置不对,可能导致请求参数被错误解析,进而让PHP代码读到奇怪的字符。这时候调整第一步的
RewriteBase应该能解决。
5. 检查PHP版本兼容性
Ubuntu 16.04默认PHP是7.0,但Laravel 5.8及以上版本需要PHP 7.1+。如果你的Laravel版本较高,得升级PHP:
# 添加PHP源 sudo add-apt-repository ppa:ondrej/php sudo apt update # 安装PHP 7.2(根据你的Laravel需求选择版本) sudo apt install php7.2 php7.2-cli php7.2-common php7.2-mbstring php7.2-xml php7.2-mysql php7.2-curl php7.2-zip # 切换Apache的PHP版本 sudo a2dismod php7.0 sudo a2enmod php7.2 sudo systemctl restart apache2
如果做完这些还是有问题,你可以实时查看Apache错误日志:tail -f /var/log/apache2/error.log,根据更详细的错误提示再针对性处理。
内容的提问来源于stack exchange,提问作者Rizky Arlin

