首页 > 解决方案 > 在 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 参数成为必需的最有效方法是什么?

标签: javascriptphp

解决方案


不是直接的答案,但我会建议另一种方法。正如对您的问题的评论中提到的,您始终可以在会话中跟踪用户输入并将(301)重定向到新页面并根据最终用户的输入加载所需的环境变量。

但是,您也可以使用 IP 检测库来评估最终用户的位置,并默认为他们的语言/位置建议或加载内容。有大量提供此功能的库和服务。

我意识到这并不能直接回答您的问题,但我发现使用此类库为我节省了大量时间/头痛,让最终用户了解设计的“替代”内容。

我不打算在这里推荐一个特定的产品,但如果你给我发消息,我很乐意推荐一个。


推荐阅读