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

Laravel嵌入遗留站点:Apache配置导致路由404问题求助

解决Apache下嵌入Laravel站点的路由404问题

问题分析

你在将Laravel嵌入遗留站点时,Valet通过自定义Driver能正常处理/laravel开头的请求,但Apache配置下访问/laravel/admin这类路由出现Laravel风格404,核心问题在于Apache的Alias与Directory路径不匹配,以及Rewrite规则的传递逻辑未正确适配Alias映射。

修复步骤

1. 修正Apache虚拟主机的Directory路径错误

你的虚拟主机配置中,Alias /laravel指向的是/var/www/xxxx/dev/laravel/public,但对应的Directory块却写了/var/www/xxxx/laravel/public(缺少dev目录),这会导致Apache无法正确应用该目录下的Rewrite规则。修改如下:

# 替换原错误的Directory块
<Directory /var/www/xxxx/dev/laravel/public>
    AllowOverride All
    Options -MultiViews -Indexes
    SSLRequireSSL
</Directory>

2. 调整Laravel public目录的.htaccess规则

原.htaccess的Rewrite规则在Alias映射场景下,需要确保请求URI完整传递给Laravel的前端控制器。修改RewriteRule行,同时保留必要的授权头处理:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On
    RewriteBase /laravel

    # 处理授权头
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # 移除末尾斜杠
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # 转发所有非文件/目录请求到index.php
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

3. 配置Laravel的APP_URL

在Laravel项目的.env文件中,设置正确的应用URL,确保路由生成和内部跳转正常:

APP_URL=https://your-domain/laravel

4. 清理缓存并重启服务

  • 清除Laravel路由和配置缓存:
    php artisan route:clear
    php artisan config:clear
    
  • 重启Apache服务:
    sudo systemctl restart apache2
    

替代方案:直接在Apache配置中写入Rewrite规则(更可靠)

如果不想依赖.htaccess,可以直接在虚拟主机的Directory块中配置Rewrite规则,避免AllowOverride的性能开销和潜在问题:

<Directory /var/www/xxxx/dev/laravel/public>
    AllowOverride None
    Options -MultiViews -Indexes
    SSLRequireSSL

    RewriteEngine On
    RewriteBase /laravel

    # 处理授权头
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # 移除末尾斜杠
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # 转发请求到Laravel前端控制器
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</Directory>

内容的提问来源于stack exchange,提问作者Stefano Finetti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 03:27:04