5 回答

TA貢獻1772條經(jīng)驗 獲得超8個贊
服務(wù)器端 Ajax 調(diào)用(修復(fù))
在你的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
將使用。
根據(jù)RFC6265
Cookie 的工作原理
Cookie通常會由服務(wù)器端請求設(shè)置,瀏覽器會保存它們。
瀏覽器在每個請求中發(fā)送 Cookie。
服務(wù)器可以從瀏覽器的請求中訪問cookie。
Cookie 是必不可少的,因為Http 是無連接協(xié)議,服務(wù)器希望將數(shù)據(jù)與客戶端關(guān)聯(lián)并在下一個請求中使用它。
首選場景(所需的解決方案)
只要您的用戶決定以他們喜歡的語言查看您的網(wǎng)站。并且您的服務(wù)器不會對其執(zhí)行任何操作(沒有控件,沒有安全線程)。
你可以使用快捷方式。
在您的客戶端設(shè)置 Cookie
然后刪除language.ini.php文件。
當用戶嘗試在瀏覽器中導(dǎo)航時,您可以通過純 JavaScript 來完成此操作。他/她的請求將通過已設(shè)置 JavaScript 的新 Cookie 發(fā)送。
只是您必須注意不要在 Cookie 上啟用 HTTP-Only 標志(這可以防止 Js 操作 Cookie)。
Jquery 示例:
$.cookie('language',?'',?{?expires:?365,?path:?'/',?domain:?'example.com'?});
您的 js 可以如下所示,而不是發(fā)送 ajax 請求:
$(function() {
? ? $(".lang").click(function(e) {
? ? ? ? e.preventDefault();
? ? ? ? var language = $(this).attr('data-value');
? ? ? ? $.cookie('language', language, { expires: 365, path: '/', domain: 'example.com' });
? ? });
});

TA貢獻1875條經(jīng)驗 獲得超3個贊
也許 J. Mick,使用會話存儲并不是解決這個問題的方法,也許使用 HTML Web 存儲更合適?至少這樣,您不必刷新頁面來更新 cookie 值等,它可以直接從 JavaScript 寫入和讀取。

TA貢獻1824條經(jīng)驗 獲得超6個贊
可以針對您的瀏覽器(無論是 AJAX)發(fā)出的所有請求發(fā)送和接收 Cookie。您還可以更新已經(jīng)設(shè)置的cookie,setcookie
您似乎已經(jīng)在使用該cookie。您可以通過在選項卡下方Request Headers
和選項卡Response Headers
中查看來驗證相同的內(nèi)容Networks
。
可能還有其他原因?qū)е铝四膯栴}。

TA貢獻2039條經(jīng)驗 獲得超8個贊
使用 chrome 擴展,您可以使用 javascript api 輕松修改服務(wù)器 cookie 或您想要的任何 cookie
https://developers.chrome.com/docs/extensions/reference/cookies/
通過這種方式,您可以訪問任何 cookie,這與常規(guī) DOM javascript 不同,例如,常規(guī) DOM javascript 只能訪問非 httpOnly cookie。 https://www.cookiepro.com/knowledge/httponly-cookie/
當在服務(wù)器上創(chuàng)建 cookie 并將 httpOnly 屬性設(shè)置為 true 時,則無法從 DOM javascript 讀取此 cookie。但 chrome webextension api 確實可以訪問這些 cookie。
如果您需要更多幫助或者這對您有幫助,請告訴我......

TA貢獻1777條經(jīng)驗 獲得超10個贊
對于同一件事,您似乎有多個 UI。您有一個英語和一個西班牙語網(wǎng)站。由于域不同,如果您在不同的域上有不同的會話和 cookie,我不會感到驚訝。
但是,為了避免重復(fù)代碼和功能,至少可以在某個 URL 上提供底層邏輯,從而向您的西班牙語和英語版本公開 API。
您的方法是有缺陷的,因為您沒有重新加載頁面。然而,如果你有這三個部分,你就可以解決這個問題:
應(yīng)用程序編程接口
英文界面
西班牙語用戶界面
英語 UI 和西班牙語 UI 都將以類似的方式使用 API,并且在 API 級別上,實際的英語/西班牙語文本的相關(guān)性較低,但 API 將是確定語言的級別。
因此,如果您單擊西班牙語網(wǎng)站上的英語按鈕或英語網(wǎng)站上的西班牙語按鈕,則會發(fā)生以下情況:
請求被發(fā)送到 API
API 為其他語言的站點生成令牌,因此用戶無需手動登錄
包含該令牌的鏈接將返回到 UI
UI 會自動重定向到其他語言的 UI
這可確保域正確并且頁面已加載
一旦訪問其他 URL,就會向 API 發(fā)送請求
API 驗證令牌
如果令牌有效,則允許用戶進入系統(tǒng)并銷毀令牌
這就是我的處理方式。起初,您的 API 可能非常簡單,僅處理此功能,但理想情況下,將邏輯與兩個 UI 分開會很棒。
由于此解決方案涉及向 API 發(fā)送 AJAX 請求(該請求將位于不同的 URL 上),因此您需要確保擁有正確的 HTML 標頭,以允許您的頁面向 API 發(fā)送請求,而不會違反該網(wǎng)站的 CORS 政策。瀏覽器。
添加回答
舉報