开始前先来抱怨一下,本来我的网站可以依使用者的浏览器自动显示不同的语系的。
这有何不可,但Google的SEO似乎不喜欢这么搞,他建议每种语言使用不同的网址,
不要用cookie或浏览器设置来调整网页内容,好吧那我只能乖乖就范了。
他的建议作法,
第一种方案:
依国家区分,像是example.tw或example.de
这真的天方夜谭怎么可能,要嘛收购被注册的域名,要不然取个全球没人会取的怪域名还比较有机会。
第二种方案:
用子域名区分,这正式我准备要做的,等等来说明在Laravel中怎么弄。
第三种方案:
example.com/tw/ 之类的,Apple好像就这么弄的。
第四种方案:
site.com?loc=tw之类,不建议使用,确实我也觉的这个不是一个好主意。
我当然是想,code改一支就好,别不同的网站还要改不同的code,
Laravel双生武魂、先天满魂力您说是不是,听不懂哦,我卡通看太多,
我指Laravel内建多语环境了,连.env也可以有多个 呀 ,
当然是一个主机环境跑我所有想支持的语系比较方便,是吧?
经过了一堆抱怨跟废话后,问题来了,我怎么弄。
开启bootstrap/app.php,粘贴进程码在$app初始化的下方罗:
透过$app->loadEnvironmentFrom,我们就能自动依子域名加载不同的.env档了,即.env.[子域名]。
原则上要我们的proxy有定义的子域名才能吃到相对的.env.[子域名]文件,乱打是不通的,
我认为理论上并不会有什么安全顾虑,我的理解是这样。
<?php
/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| The first thing we will do is create a new Laravel application instance
| which serves as the "glue" for all the components of Laravel, and is
| the IoC container for the system binding all of the various parts.
|
*/
$app = new Illuminate\Foundation\Application(
$_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);
//依子域名加载env
if(!empty($_SERVER['HTTP_HOST'])){
$subdomain_envfile = sprintf(".env.%s",explode(".",$_SERVER['HTTP_HOST'])[0]);
$app->loadEnvironmentFrom($subdomain_envfile);
}
上面的进程中,容我说明一下,这个empty($_SERVER['HTTP_HOST'])的检测很重要。
因为artisan可没有$_SERVER['HTTP_HOST']这种东西,这会造成加载.env失败。
所以需判断$_SEVER['HTTP_HOST']存在时,才去载有子域名的.env.[子域名」文件。
假设,我有两个域名:
www.ccc.tc及en.ccc.tc(计划上线中),别试现在还没有,
我的自动化wildcard子域名的证书申请进程每个礼拜都用光所有额度,要再等一天我才能 再申请新的@@。
那么,开启en.ccc.tc,就能自动加载.env.en的环境罗。
如果我们的设置都没问题,那么加上--env的参数tinker也是能正常开启的。
偷偷透漏,我已经实做多翻译API的调用了,有几个真的佛心来著,是计次不是计字,
这个网站只是个人学习日志跟分享用的,搞到买翻译API付费调用这我辨不到,只能跟那些厂商说抱歉啦。
架构已完成了,有机会再多扩展一些不同的API,翻译质量我就顾不上了,最多再人工调整一下😝
被我用爆了好几个0元的订阅方案,初步想法让这个网站支持中英日语系😎。
如果您喜欢本文章,救救我的SEO,帮我压个赞感谢您。
No Comment
Post your comment