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

Laravel 9单一路由自动在URL中添加/public/问题求助

Laravel 9 Apache服务器下/resources路由自动追加/public/的问题

问题现象

  • Laravel 9网站多数路由正常,但访问https://example.com/resources时会自动跳转为https://example.com/public/resources,页面可访问但URL不符合预期
  • resources所有子路由(如https://example.com/resources/locations)无此异常
  • 本地通过php artisan serve运行完全正常,仅在Apache v2.4.29(Ubuntu)服务器端出现该问题

已核实信息

路由列表(php artisan route:list输出)

GET|HEAD   / ............................................................................................................ home
POST       _ignition/execute-solution .......... ignition.executeSolution › Spatie\LaravelIgnition › ExecuteSolutionController  
GET|HEAD   _ignition/health-check ...................... ignition.healthCheck › Spatie\LaravelIgnition › HealthCheckController  
POST       _ignition/update-config ................... ignition.updateConfig › Spatie\LaravelIgnition › UpdateConfigController  
GET|HEAD   api/user .............................................................................. generated::aJrGF7dIWENf1Kwl  
GET|HEAD   company ................................................................................................... company  
GET|HEAD   contact ................................................................................................... contact  
GET|HEAD   contact/careers ................................................................................... contact-careers  
GET|HEAD   contact/expert ..................................................................................... contact-expert  
GET|HEAD   contact/quote ....................................................................................... contact-quote
GET|HEAD   contact/survey ..................................................................................... contact-survey  
GET|HEAD   contact/technical ............................................................................... contact-technical  
GET|HEAD   contact/thank-you ................................................................................ contact-thankyou  
GET|HEAD   industries ....................................................................................... industries-index  
GET|HEAD   products ........................................................................................... products-index  
GET|HEAD   products/ilh ......................................................................................... products-ilh  
GET|HEAD   products/ils ......................................................................................... products-ils  
GET|HEAD   products/ilt ......................................................................................... products-ilt  
GET|HEAD   products/iltr ....................................................................................... products-iltr  
GET|HEAD   projects ........................................................................................... projects-index  
GET|HEAD   resources ......................................................................................... resources-index  
GET|HEAD   resources/cv ......................................................................................... resources-cv  
GET|HEAD   resources/locations ........................................................................... resources-locations  
GET|HEAD   resources/login ................................................................................... resources-login  
GET|HEAD   resources/privacy ............................................................................... resources-privacy  
POST       resources/process ........................................... resources-process › ResourcesController@resourcesForm  
GET|HEAD   resources/terms ................................................................................... resources-terms  
GET|HEAD   resources/terms-detail ..................................................................... resources-terms-detail  
POST       resources/terms/process .......................................... terms-process › ResourcesController@termsProcess
GET|HEAD   resources/warranties ......................................................................... resources-warranties  
GET|HEAD   sanctum/csrf-cookie ............................. sanctum.csrf-cookie › Laravel\Sanctum › CsrfCookieController@show  
GET|HEAD   services ................................................................................................. services  

web.php中的路由组代码

Route::group(['prefix' => 'resources'], function() {
    Route::get('/', function() {
        return view('resources.index');
    })->name('resources-index');

    Route::get('locations', function() {
        return view('resources.locations');
    })->name('resources-locations');
    ...
}

解决步骤

1. 修正Apache虚拟主机根目录配置

确保Apache虚拟主机的DocumentRoot指向Laravel项目的public文件夹,而非项目根目录。示例配置如下:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/your-project/public

    <Directory /var/www/your-project/public>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/your-project-error.log
    CustomLog ${APACHE_LOG_DIR}/your-project-access.log combined
</VirtualHost>

配置完成后重启Apache:

sudo systemctl restart apache2

2. 清理项目根目录的.htaccess(若存在)

Laravel的URL重写规则仅需放在public目录下的.htaccess中,若项目根目录有额外的.htaccess文件,可能会引发异常跳转,建议直接删除或注释其中的重写规则。

3. 检查public目录下的.htaccess配置

确保public/.htaccess使用Laravel默认配置,内容如下:

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

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

若有自定义规则,暂时注释后测试是否解决问题。

4. 清除路由与配置缓存

执行以下命令清除缓存,确保路由规则生效:

php artisan route:clear
php artisan config:clear

5. 禁用Apache目录索引

Laravel项目根目录默认存在resources文件夹,若Apache开启了目录索引,可能会触发目录跳转。在public/.htaccess中添加以下规则禁用目录索引:

Options -Indexes

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:35:37