通过 htaccess 强制语言 GET 变量还是...?
我有 3 个子域,它们基于 Opencart。 我需要对给定语言的每个域强制执行
_GET['language'] 应该为每个子域 en.handmade24.at 严格定义
->语言=en
ru.handmade24.at ->语言=ru
www.handmade.24.at -> language=de
我被告知 .htaccess 是强制语言变量的一个不错的选择...
但是我如何定义规则?有什么帮助吗?我在 htaccess 中是虚拟的...
我的 Htaccess 看起来像这样
选项 +FollowSymlinks # 防止目录列表 选项-索引 # 防止直接访问文件
订单拒绝、允许 所有人都否认 # SEO 网址设置 重写引擎开启 重写库 / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]
或者也许你可以提供更好的解决方案?
I have 3 subdomains , which are based on Opencart.
What I need to force on each domain given language
to do so _GET['language'] should be defined strictly for each subdomain
en.handmade24.at -> language=en
ru.handmade24.at -> language=ru
www.handmade.24.at -> language=de
I was told .htaccess was a good option to force language variable...
But how can i define the rules? Any help? I am dummy in htaccess...
my Htaccess looks like this
Options +FollowSymlinks # Prevent Directoy listing Options -Indexes # Prevent Direct Access to files <FilesMatch "\.(tpl|ini)"> Order deny,allow Deny from all </FilesMatch> # SEO URL Settings RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]
Or maybe you could offer nicer solution?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是应该适合您的 .htaccess:
Here is the .htaccess that should work for you:
首先,我已经为解决你的问题的项目取出了 OpenCart 系统,但是这个技巧应该可以正常工作。
是的,您可以使用 .htaccess 来做到这一点,但我不建议这样做。在某些地方,弄乱 .htaccess 可能会很痛苦。如果你这样做,在某些时候你很可能最终会做错事并腐败一些东西。这不是唯一的解决方案,这就是为什么我不会告诉您如何使用 .htaccess 来做到这一点。
我推荐的解决方案是我刚刚制作的一个巧妙的小解决方法/技巧。我正在寻找一种使用子域来实现这一点的方法,因为它是 Google 制作网站多语言版本的首选(当然 TLD 除外)。
我想出了解决方案来推翻默认的 OpenCart 语言选择/检测。
首先,在 OpenCart 安装的根目录中打开 index.php。
找到以下行:
然后用以下内容替换这些行:
这是做什么的(注意:OpenCart 之前几行从数据库中加载了可用语言):
我们从数据库中获取 URL(“设置表”) “其中 key = 'config_url'),然后我们使用 PHP 函数 parse_url,它将其分成几部分(对其执行 print_r() 以查看哪些部分)。
然后,我们循环访问可用的语言(在管理面板中启用的语言)。
在循环中,我们检查是否
$language['code'] 。 '.' 。 $url_info['host']
==$request->server['HTTP_HOST']
($_SERVER['HTTP_HOST']
的别名) 。我已经添加了一个break
,这样如果它已经找到了该域的匹配语言,它就会停止浪费资源。我已经编辑了 OpenCart 使用上述语句制作的 if elseif 等 else 语句。它的作用是检查 $overwrite_language 是否已设置,如果设置了,则它使用户“ * 选择 * ”的语言,因为它命中了 if elseif 等中的
if
等 else语句,那么它就不会运行任何其他语句(然后会覆盖这个小工作环境/黑客)。-- 额外提示 --
如果您有权访问 php.ini 配置文件,或者您有权使用 ini_set(),那么您可以在子域之间共享 PHP 会话
(您可能需要销毁已创建的会话)。这可能是一个优势,但请注意,它将覆盖默认的商店语言,但您可以修改刚刚更改的行下方的 2 个
if
。不过,货币应该照常运作。-- 结束 --
应该就是这样了,希望你会喜欢它并且能够使用它,尽管你问这个问题已经很久了,也许其他人也可以使用它,就像我几个小时前一样。
First of all, I have taken out the OpenCart system for the project which I solved your issue, but this trick should work just fine.
Yes you can do it with .htaccess, however I do not want to recommend doing that. Messing with .htaccess can be a pain in a certain place. If you do it, at some point you will most likely end up doing something wrong and corrupt something. It isn't the only solution, and that is why I wont tell you how to do it with .htaccess.
The solution I would recommend is a neat little work-around/hack I've just made. I where looking for a way to do it with subdomains, since it is Google's preferred choice of doing the multi language versions of websites (except of TLD's of course).
I came up with the solution to overrule the default OpenCart language selection/detection.
First of all open up index.php in the root of your OpenCart install.
Go find the lines with this:
Then replace those lines with this:
What this do is (note: OpenCart did load the available languages from the database a few lines earlier):
We get the URL from the database ("setting table" where key = 'config_url'), then we use the PHP function parse_url, which splits it up in parts (do a print_r() on it to see what parts).
We then loops through the languages that is available (those that are enabled in the admin panel).
In the loop we check if the
$language['code'] . '.' . $url_info['host']
==$request->server['HTTP_HOST']
(an alias of$_SERVER['HTTP_HOST']
). I've put in abreak
so it would stop wasting resources if it already have found a matching language for the domain.I've edited the if elseif etc etc else statement that OpenCart made whith the above one. What it does is that it check if $overwrite_language is set, if it is then it makes that the language that the user " * selected * ", since it hit the
if
in the if elseif etc etc else statement then it wont run any of the others (which then would overwrite this little work-arround/hack).-- Bonus tip --
If you have access to the php.ini config file, or you have permission to use ini_set(), then you can share your PHP session between subdomains
(you may need to destroy an already created session). That could be an advantage, however note that it will overwrite the default shop language, but you can modify the 2
if
's below the lines you just changed. The currencies should work as usual though.-- Finishing up --
That should be it, hope you will like it and can use it, even though it is a long time you asked this question, maybe someone else could use it, just as I could a few hours ago.