无SSH共享主机下Laravel子目录部署及缓存清除问题排查
一、子目录部署Laravel的配置修正
首先看你当前的.htaccess和index.php配置存在几个问题,我逐一说明并修正:
1. .htaccess 配置错误
你的重定向尾随斜杠规则会把请求跳转到网站根目录,而不是目标子目录/v2/,需要修改这一行:
原错误代码:
RewriteRule ^(.*)/$ /$1 [L,R=301]
修正后:
RewriteRule ^(.*)/$ /v2/$1 [L,R=301]
完整的.htaccess应该是这样:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule> RewriteEngine On RewriteBase /v2/ # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /v2/$1 [L,R=301] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] </IfModule>
2. index.php 路径错误
假设你的Laravel项目完整结构是在/v2/目录下(即/v2/app/、/v2/bootstrap/等文件夹存在),而index.php直接放在/v2/目录下作为站点入口,那么你当前的路径会错误指向根目录下的bootstrap文件夹,完全偏离目标路径。
原错误代码:
require __DIR__.'/../v2/bootstrap/autoload.php'; $app = require_once __DIR__.'/../v2/bootstrap/app.php';
修正后:
require __DIR__.'/bootstrap/autoload.php'; $app = require_once __DIR__.'/bootstrap/app.php';
如果你的index.php是放在/v2/public/目录下,且希望通过website.com/v2访问,那需要把主机的站点根目录设置为/v2/public/,此时.htaccess放在/v2/public/下,index.php路径保持默认即可:
require __DIR__.'/../bootstrap/autoload.php'; $app = require_once __DIR__.'/../bootstrap/app.php';
二、缓存清除的问题解决
你添加的路由访问时显示“Under Construction”,大概率是因为之前的配置错误导致Laravel路由系统未正常加载,或者已有的路由缓存让新添加的路由无法生效。可以按照以下步骤解决:
1. 先确保基础配置正常
先修正上面的.htaccess和index.php配置,保证Laravel站点能正常访问(至少能显示默认页面或你的自定义页面),否则路由根本无法被解析。
2. 修正缓存路由的路径
你的路由里写了/v2/configcache,但站点已经在/v2/子目录下,路由应该去掉前缀,直接写:
Route::get('/configcache', function() { $exitCode = Artisan::call('config:cache'); return 'Config cache cleared! Exit code: ' . $exitCode; });
访问地址应为mywebsite.com/v2/configcache。
3. 手动清除缓存(应对路由缓存失效场景)
如果因为之前缓存了路由,导致新添加的/configcache路由不生效,你可以手动删除/v2/bootstrap/cache/目录下的routes.php和config.php文件(如果存在),这会强制Laravel重新加载路由和配置。
4. 一键清除所有缓存的备选方案
如果以上方法还是不行,你可以添加一个能清除所有缓存的路由:
Route::get('/clear-all-cache', function() { Artisan::call('cache:clear'); Artisan::call('config:clear'); Artisan::call('route:clear'); Artisan::call('view:clear'); return 'All caches cleared successfully!'; });
访问mywebsite.com/v2/clear-all-cache即可一次性清除所有类型的缓存。另外,你也可以直接修改.env文件(比如随便加个空格再保存),这会触发Laravel自动清除配置缓存。
内容的提问来源于stack exchange,提问作者Thomas

