如何使用 Ajax 更改服务器端语言 cookie,就像客户端一样?

我有两个新闻网站,一个是西班牙语,一个是英语:


es.example.com // Spanish

example.com // English

但从主域(英语)我正在集成一个系统,以便能够以另一种语言显示新闻,例如:


example.com/es/url-de-la-noticia/ // Spanish

根据该 URL,我创建一个“cookie”,其中将存储 URL 的语言,这是第一个文件夹/子文件夹或目录“/es/”:


//I create the cookies automatically for the subdomain and for the URLs in Spanish.

if($FOLDER_LANG === "es" || $SUBDOMAIN_LANG === "es") {

    setcookie ('language', 'es', time()+60*60*24*365, '/', '.example.com');

}

使用此参数,网站的新闻将以西班牙语显示:es.example.com通过子域es或通过西班牙语的 URL example.com/es/url-de-la-noticia/=es


//We verify the existence of the cookie

if(isset($_COOKIE['language'])){

    //We print variables of the language in coincidence of the value that the cookie stores

    if($_COOKIE['language']==='en'){

        $website_title = " | Sitio en español";

        $lang = 'es';

        $language = "es";

    }elseif($_COOKIE['language']==='es'){

        $website_title = " | WebSite Ingles";

        $lang = 'en';

        $language = "en";

    }

} else {

    //In case there is no cookie, I show the English language by default.

    $website_title = " | WebSite Ingles";

    $lang = 'en';

    $language = "en";

}

到目前为止,一切似乎都运行正常。


但是当我尝试通过Ajax更改语言时,问题就出现了,虽然Ajax代码确实发送和发送信息,但由于某种原因它并没有替换cookie,也就是说,如果我点击英文语言,它并没有改变它,语言的变化。

language.ini.php文件将负责更改语言、创建各自的 cookie。


<?php

    if (isset($_POST['lang'])) {

        $lang = $_POST['lang'] ?: '';

    

        if ($lang === "en") {

            setcookie ('language', 'en', time()+60*60*24*365, '/', 'example.com');

        } elseif ($lang === "es") {

            setcookie ('language', 'es', time()+60*60*24*365, '/', 'es.example.com');

        }

    }

?>


红颜莎娜
浏览 105回答 5
5回答

料青山看我应如是

服务器端 Ajax 调用(修复)在你的language.ini.php中你必须改变这一行:setcookie ('language', 'es', time()+60*60*24*365, '/', 'es.example.com');到 : setcookie ('language', 'es', time()+60*60*24*365, '/', 'example.com');因为如果您在标头中指定cookie 的域,则它将不是仅主机 cookie,并且在您的两者中example.com都es.example.com将使用。根据RFC6265Cookie 的工作原理Cookie通常会由服务器端请求设置,浏览器会保存它们。浏览器在每个请求中发送 Cookie。服务器可以从浏览器的请求中访问cookie。Cookie 是必不可少的,因为Http 是无连接协议,服务器希望将数据与客户端关联并在下一个请求中使用它。首选场景(所需的解决方案)只要您的用户决定以他们喜欢的语言查看您的网站。并且您的服务器不会对其执行任何操作(没有控件,没有安全线程)。你可以使用快捷方式。在您的客户端设置 Cookie然后删除language.ini.php文件。当用户尝试在浏览器中导航时,您可以通过纯 JavaScript 来完成此操作。他/她的请求将通过已设置 JavaScript 的新 Cookie 发送。只是您必须注意不要在 Cookie 上启用 HTTP-Only 标志(这可以防止 Js 操作 Cookie)。Jquery 示例:$.cookie('language', '', { expires: 365, path: '/', domain: 'example.com' });您的 js 可以如下所示,而不是发送 ajax 请求:$(function() {    $(".lang").click(function(e) {        e.preventDefault();        var language = $(this).attr('data-value');        $.cookie('language', language, { expires: 365, path: '/', domain: 'example.com' });    });});

翻过高山走不出你

也许 J. Mick,使用会话存储并不是解决这个问题的方法,也许使用 HTML Web 存储更合适?至少这样,您不必刷新页面来更新 cookie 值等,它可以直接从 JavaScript 写入和读取。

慕妹3242003

可以针对您的浏览器(无论是 AJAX)发出的所有请求发送和接收 Cookie。您还可以更新已经设置的cookie,setcookie您似乎已经在使用该cookie。您可以通过在选项卡下方Request Headers和选项卡Response Headers中查看来验证相同的内容Networks。可能还有其他原因导致了您的问题。

largeQ

使用 chrome 扩展,您可以使用 javascript api 轻松修改服务器 cookie 或您想要的任何 cookiehttps://developers.chrome.com/docs/extensions/reference/cookies/通过这种方式,您可以访问任何 cookie,这与常规 DOM javascript 不同,例如,常规 DOM javascript 只能访问非 httpOnly cookie。&nbsp;https://www.cookiepro.com/knowledge/httponly-cookie/当在服务器上创建 cookie 并将 httpOnly 属性设置为 true 时,则无法从 DOM javascript 读取此 cookie。但 chrome webextension api 确实可以访问这些 cookie。如果您需要更多帮助或者这对您有帮助,请告诉我......

不负相思意

对于同一件事,您似乎有多个 UI。您有一个英语和一个西班牙语网站。由于域不同,如果您在不同的域上有不同的会话和 cookie,我不会感到惊讶。但是,为了避免重复代码和功能,至少可以在某个 URL 上提供底层逻辑,从而向您的西班牙语和英语版本公开 API。您的方法是有缺陷的,因为您没有重新加载页面。然而,如果你有这三个部分,你就可以解决这个问题:应用程序编程接口英文界面西班牙语用户界面英语 UI 和西班牙语 UI 都将以类似的方式使用 API,并且在 API 级别上,实际的英语/西班牙语文本的相关性较低,但 API 将是确定语言的级别。因此,如果您单击西班牙语网站上的英语按钮或英语网站上的西班牙语按钮,则会发生以下情况:请求被发送到 APIAPI 为其他语言的站点生成令牌,因此用户无需手动登录包含该令牌的链接将返回到 UIUI 会自动重定向到其他语言的 UI这可确保域正确并且页面已加载一旦访问其他 URL,就会向 API 发送请求API 验证令牌如果令牌有效,则允许用户进入系统并销毁令牌这就是我的处理方式。起初,您的 API 可能非常简单,仅处理此功能,但理想情况下,将逻辑与两个 UI 分开会很棒。由于此解决方案涉及向 API 发送 AJAX 请求(该请求将位于不同的 URL 上),因此您需要确保拥有正确的 HTML 标头,以允许您的页面向 API 发送请求,而不会违反该网站的 CORS 政策。浏览器。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript