javascript - 在 URL 中设置 GET 参数的默认值
问题描述
我有一个多语言网站。我有自己的多语言系统实现:在标题中,用户可以选择与他的语言匹配的标志。当他单击一种语言时,他会从https://example.com重定向到https://example.com/?lang=nl,例如,当他选择比利时(荷兰语 -> 荷兰 -> nl)时。
当页面加载 Javascript 代码时,检查是否设置了 lang GET 参数。如果已设置,代码将搜索 HTML 中的所有现场锚标记,并将正确的语言标记(nl、en、fr、...)附加到该锚标记的 href 属性。
所以例如<a href="/about">about us</a>
变成<a href="/about?lang=nl">about us</a>
. 这样,用户总是停留在同一个“语言泡沫”中。
然后我有一个 PHP 函数,它检查 lang GET 参数并在数据库中搜索与所需语言output($text_tag)
匹配的文本。text_tag
例如:
+----+----------+------+------------+
| Id | text_tag | lang | text |
+----+----------+------+------------+
| 1 | %hello% | EN | Hello! |
| 2 | %hello% | NL | Goedendag! |
| 3 | %hello% | FR | Bonjour! |
+----+----------+------+------------+
output("%hello%")
$_GET['lang'] == "FR"
例如将返回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 检测库来评估最终用户的位置,并默认为他们的语言/位置建议或加载内容。有大量提供此功能的库和服务。
我意识到这并不能直接回答您的问题,但我发现使用此类库为我节省了大量时间/头痛,让最终用户了解设计的“替代”内容。
我不打算在这里推荐一个特定的产品,但如果你给我发消息,我很乐意推荐一个。
推荐阅读
- docker - Docker 容器中的 dotnet 还原失败
- php - 如何为不同的域/请求 url 设置不同的 .htaccess?
- java - 你如何计算 O(log n) 乘以复杂度的平衡二叉搜索树的高度?
- firebase - Firebase:导入和导出存储
- docker - 在 CentOS 上安装 Kylin 报错 /var/lib/docker/overlay2/
- react-native - 什么是移动应用程序中通知选项卡的好解决方案
- ios - Swift 5 和 Alamofire 5:GET 方法错误:Alamofire.AFError.URLRequestValidationFailureReason.bodyDataInGETRequest(22 字节)
- javascript - 为什么在循环内声明对象不会删除对象数据?
- android - 没有虚拟方法 setTokenProvider
- db2 - db2 sql update 计算总计列单次更新