You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 07:45:51