如何在Hostinger上实现根URL访问React SPA、/admin路由(如/admin/login)访问Laravel Blade模板?
如何在Hostinger上实现根URL访问React SPA、/admin路由(如/admin/login)访问Laravel Blade模板?
嘿,我之前帮朋友在Hostinger上部署过这种混合React+Laravel的项目,刚好就是根路径走SPA,/admin开头走Blade模板的需求,亲测可行,咱们一步步来搞定:
一、先理清楚项目结构
首先你得把React项目打包好,把build文件夹里的所有文件(index.html、static文件夹这些)放到Laravel项目的public/spa目录下(没有spa文件夹就新建一个)。这样Laravel的public目录既保留了自己的index.php入口,又能存放React的静态文件,互不干扰。
二、配置Laravel的路由
打开Laravel项目里的routes/web.php,先把所有/admin开头的路由定义好,剩下的请求都转发到React的入口:
// 所有admin相关的路由都放这个分组里,直接返回对应的Blade模板 Route::prefix('admin')->group(function () { // 比如你的登录页路由 Route::get('login', function () { return view('admin.login'); }); // 其他admin路由,比如后台首页、用户管理之类的,都在这里定义 Route::get('dashboard', function () { return view('admin.dashboard'); }); }); // 除了/admin开头的所有请求,都返回React SPA的入口文件 Route::get('/{any}', function () { return file_get_contents(public_path('spa/index.html')); })->where('any', '^(?!admin).*$');
这里的正则^(?!admin).*$是用来排除所有以admin开头的路径,确保这些请求不会被React接管,乖乖交给Laravel处理。
三、修改Hostinger上的服务器配置(.htaccess)
Hostinger用的是Apache服务器,咱们得修改Laravel项目public目录下的.htaccess文件,让服务器能正确分发请求:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # 处理/admin开头的请求,直接交给Laravel的index.php入口 RewriteRule ^admin/(.*)$ index.php [L] # 非admin的请求,如果不是存在的文件/文件夹,就返回React的index.html(支持SPA的前端路由跳转) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(?!admin).*$ spa/index.html [L] </IfModule>
这个配置的作用很明确:
- 所有
/admin/xxx的请求,都转发给Laravel处理,返回对应的Blade模板 - 其他请求如果是访问不存在的文件/文件夹(也就是React SPA的前端路由),都返回React的入口,保证SPA的页面跳转正常工作
四、Hostinger上的部署与收尾
- 把整个Laravel项目(包含public/spa里的React静态文件)上传到Hostinger的网站根目录(一般是
public_html) - 登录Hostinger控制面板,进入「Hosting」->「管理」->「域名」->「高级设置」->「文档根目录」,选择Laravel项目的
public文件夹(这一步超级重要,不然服务器找不到正确的入口文件) - 打开Hostinger的在线终端(控制面板「高级」->「终端」),执行
php artisan route:clear清除路由缓存,避免新配置的路由不生效 - 最后测试一下:访问你的根域名,应该能看到React SPA;访问
你的域名/admin/login,应该能看到Laravel的Blade登录页面
一些我踩过的坑要提醒你
- 打包React的时候,要确保
package.json里的homepage设置为空或者"/",不然静态资源路径会出错,导致React页面加载不出样式和JS - 如果Hostinger的Apache没开mod_rewrite,直接联系客服开就行,一般默认是开着的,但保险起见可以检查一下
- 要是Laravel的Blade模板加载不出来,先检查路由有没有定义对,还有视图文件是不是在
resources/views/admin目录下(比如login.blade.php必须存在)
内容来源于stack exchange
相关产品推荐
相关产品推荐

