[英]Set default value for GET-parameter in URL
我有一个多语言网站。 我有自己的多语言系统实现:在标题中,用户可以选择与其语言相匹配的标志。 例如,当他单击一种语言时,他会从https://example.com重定向到https://example.com/?lang=nl ,例如选择比利时(荷兰语 -> 荷兰语 -> nl)。
当页面加载 Javascript 代码时,检查是否设置了 lang GET 参数。 如果已设置,代码将搜索 HTML 中的所有现场锚标记并将正确的 lang-tag(nl、en、fr、...)附加到该锚标记的 href 属性。
例如<a href="/about">about us</a>
变成了<a href="/about?lang=nl">about us</a>
。 这样用户总是停留在同一个“语言泡泡”中。
然后我有一个 PHP 函数output($text_tag)
,它检查 lang GET 参数并在数据库中搜索与text_tag
和所需语言匹配的文本。
例如:
+----+----------+------+------------+
| Id | text_tag | lang | text |
+----+----------+------+------------+
| 1 | %hello% | EN | Hello! |
| 2 | %hello% | NL | Goedendag! |
| 3 | %hello% | FR | Bonjour! |
+----+----------+------+------------+
output("%hello%")
带有$_GET['lang'] == "FR"
output("%hello%")
将返回Bonjour!
.
该系统运行良好。 它可能不是最有效的,但改变这一点是不可能的。
但问题是,当用户在网站上进行第一次登录时,他只访问了 base-url,并且尚未设置 lang GET 参数。 这导致他访问的第一页上的文字没有得到相应的翻译。 当他点击一个锚标签时,如果没有设置 lang GET-param,就会选择默认语言。
所以我想解决他在网站上第一次进入时应该设置默认参数的问题。
我尝试了两种解决方案:
服务器端:
if (!isset($_GET['lang'])) {
$url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$url .= (parse_url($url, PHP_URL_QUERY) ? '&' : '?') . 'lang=nl';
header("Location: " . $url);
}
这样就完成了工作。 访问https://example.com将带您到https://example.com?lang=nl 。 但问题是这很混乱。 例如,POST 请求现在经常失败,因为我由于重定向而丢失了发布的数据。
所以我尝试了一种客户端方法。 客户端:
$(document).ready(function() {
//findGetParameter: https://stackoverflow.com/a/5448595/6533037
if (findGetParameter("lang") == null) {
let url = new URL(window.location.href);
url.searchParams.append("lang", "nl");
window.location.href = url;
}
}
这也可以正常工作,并且不会导致任何请求或任何问题。 但我正在寻找一种更有效的方法。 因为现在每个第一次访问该站点的用户都会加载该站点,然后立即重新加载以附加 lang GET 参数。 我可以想象这会导致糟糕的加载性能、用户体验和更糟糕的 SEO 结果。
那么,为 GET 参数设置默认值并使 GET 参数成为必需的最有效方法是什么?
不是直接的答案,但我将建议另一种方法。 正如对您的问题的评论中所述,您始终可以在会话中跟踪用户输入并将 (301) 重定向到新页面,并根据最终用户的输入加载您想要的环境变量。
但是,您也可以使用 IP 检测库来评估最终用户的位置,并在默认情况下建议或加载其语言/位置的内容。 有大量的库和服务提供此功能。
我意识到这并不能直接回答您的问题,但我发现使用此类库为让最终用户获得设计的“替代”内容节省了大量时间/头痛。
我不打算在这里认可特定的产品,但是如果您给我发消息,我很乐意推荐一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.