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
相关产品推荐
相关产品推荐

