Laravel部署至子目录example.com/example/path的Apache配置问题
解决Laravel部署到Apache子目录的内部服务器错误问题
问题核心
要将已开发完成的Laravel网站部署到现有站点的子目录example.com/example/path下,已上传完整项目结构,在public目录的.htaccess中配置了RewriteBase,子目录根.htaccess设置了Alias规则,但访问时出现内部服务器错误,尝试其他方案返回40X状态码,需修正Apache配置。
错误配置分析
当前配置存在三个关键问题:
- Alias指向了项目根目录,而非Laravel的入口
public目录,导致Apache无法正确解析入口文件 - 子目录.htaccess使用了Apache旧版权限语法(
Order allow,deny),可能与新版Apache环境冲突 - public目录的缓存规则中,
%{DOCUMENT_ROOT}路径未适配子目录结构,导致缓存文件查找失败
正确配置方案
1. 调整子目录根.htaccess
Alias必须指向Laravel项目的public目录,同时更新权限配置为Apache 2.4+兼容语法:
<IfModule mod_alias.c> # 替换<user>为实际服务器用户名,Alias路径指向Laravel的public目录 Alias /example/path /home/www/<user>/html/example/path/public <Directory "/home/www/<user>/html/example/path/public"> Options -Indexes +FollowSymLinks AllowOverride All # Apache 2.4+ 标准权限配置 Require all granted </Directory> </IfModule>
- 移除
MultiViews选项,避免与Laravel路由规则冲突 - 用
Require all granted替代旧版Order allow,deny语法,适配现代Apache环境
2. 修改public目录.htaccess
调整RewriteBase和缓存规则路径,适配子目录部署场景:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On RewriteBase /example/path/ # 处理授权Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # 移除末尾斜杠(非目录请求) RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # 优先返回缓存页面(适配子目录路径) RewriteCond %{REQUEST_URI} ^/example/path/?$ RewriteCond %{DOCUMENT_ROOT}/example/path/page-cache/pc__index__pc.html -f RewriteRule .? /example/path/page-cache/pc__index__pc.html [L] RewriteCond %{DOCUMENT_ROOT}/example/path/page-cache%{REQUEST_URI}.html -f RewriteRule . /example/path/page-cache%{REQUEST_URI}.html [L] # Laravel前端控制器规则 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule> <FilesMatch "\.(jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf|eot|otf)$"> Header set Cache-Control "max-age=2628000, public" </FilesMatch> <FilesMatch "\.(css|js)$"> Header set Cache-Control "max-age=86400, public" </FilesMatch>
- 给
RewriteBase末尾添加斜杠,避免路径解析歧义 - 修正缓存规则中的请求路径匹配和文件路径,确保指向子目录下的
page-cache文件夹
3. 后续检查项
- 确保Laravel项目的
storage、bootstrap/cache目录拥有Apache用户(通常为www-data)的读写权限 - 重启Apache服务使配置生效:
sudo systemctl restart apache2 - 更新Laravel的
.env文件,设置APP_URL=https://example.com/example/path,Laravel 9+需同步设置ASSET_URL
内容的提问来源于stack exchange,提问作者liam-milbel
相关产品推荐
相关产品推荐

