繁体   English   中英

为 URL 中的 GET 参数设置默认值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM