XMLHttpRequest không thể tải XXX Không có tiêu đề 'Access-Control-Allow-Origin'

119
Peter David Carter 2016-02-23 02:19.

tl; dr; Về Chính sách Xuất xứ Giống nhau

Tôi có một quy trình Grunt khởi tạo một phiên bản của máy chủ express.js. Điều này đã hoạt động hoàn toàn tốt cho đến bây giờ khi nó bắt đầu phân phát một trang trống với thông tin sau xuất hiện trong nhật ký lỗi trong bảng điều khiển của nhà phát triển trong Chrome (phiên bản mới nhất):

XMLHttpRequest không thể tải https://www.example.com/ Không có tiêu đề 'Access-Control-Allow-Origin' trên tài nguyên được yêu cầu. Nguồn gốc ' http: // localhost: 4300 ' do đó không được phép truy cập.

Điều gì đang ngăn tôi truy cập trang?

7 answers

224
Quentin 2016-02-23 02:26.

tl; dr - Có phần tóm tắt ở cuối và các tiêu đề trong câu trả lời để giúp bạn dễ dàng tìm thấy các phần liên quan hơn. Mặc dù vậy, bạn nên đọc mọi thứ vì nó cung cấp nền tảng hữu ích để hiểu lý do tại sao giúp việc xem cách áp dụng trong các trường hợp khác nhau dễ dàng hơn.

Về Chính sách Xuất xứ Giống nhau

Đây là Chính sách Nguồn gốc Giống nhau . Nó là một tính năng bảo mật được thực hiện bởi các trình duyệt.

Trường hợp cụ thể của bạn đang hiển thị cách nó được triển khai cho XMLHttpRequest (và bạn sẽ nhận được kết quả giống hệt nhau nếu bạn sử dụng tìm nạp), nhưng nó cũng áp dụng cho những thứ khác (chẳng hạn như hình ảnh được tải vào a <canvas>hoặc các tài liệu được tải vào một <iframe>), chỉ với triển khai hơi khác nhau.

(Thật kỳ lạ, nó cũng áp dụng cho các phông chữ CSS, nhưng đó là vì các xưởng đúc được phát hiện nhấn mạnh vào DRM chứ không phải các vấn đề bảo mật mà Chính sách Nguồn gốc Giống nhau thường đề cập).

Kịch bản tiêu chuẩn thể hiện sự cần thiết của SOP có thể được trình bày bằng ba ký tự :

  • Alice là một người có trình duyệt web
  • Bob điều hành một trang web ( https://www.[website].com/trong ví dụ của bạn)
  • Mallory điều hành một trang web ( http://localhost:4300trong ví dụ của bạn)

Alice đã đăng nhập vào trang của Bob và có một số dữ liệu bí mật ở đó. Có lẽ đó là mạng nội bộ của công ty (chỉ có thể truy cập được đối với các trình duyệt trong mạng LAN), hoặc ngân hàng trực tuyến của cô ấy (chỉ có thể truy cập bằng cookie bạn nhận được sau khi nhập tên người dùng và mật khẩu).

Alice truy cập trang web của Mallory có một số JavaScript khiến trình duyệt của Alice gửi yêu cầu HTTP đến trang web của Bob (từ địa chỉ IP của cô ấy với cookie của cô ấy, v.v.). Điều này có thể đơn giản như sử dụng XMLHttpRequestvà đọc responseText.

Chính sách Nguồn gốc Giống nhau của trình duyệt ngăn không cho JavaScript đọc dữ liệu do trang web của Bob trả về (mà Bob và Alice không muốn Mallory truy cập). (Lưu ý rằng bạn có thể, ví dụ: hiển thị hình ảnh bằng cách sử dụng một <img>phần tử trên các nguồn gốc vì nội dung của hình ảnh không được hiển thị với JavaScript (hoặc Mallory)… trừ khi bạn ném canvas vào hỗn hợp trong trường hợp đó bạn sẽ tạo ra một nguồn gốc giống nhau lỗi vi phạm).


Tại sao Chính sách xuất xứ giống nhau được áp dụng khi bạn không nghĩ nó nên

Đối với bất kỳ URL nhất định nào, có thể không cần SOP. Một số tình huống phổ biến trong trường hợp này là:

  • Alice, Bob và Mallory là cùng một người.
  • Bob đang cung cấp thông tin hoàn toàn công khai

… Nhưng trình duyệt không có cách nào để biết liệu một trong hai điều trên có đúng hay không, vì vậy sự tin tưởng không tự động và SOP được áp dụng. Quyền phải được cấp một cách rõ ràng trước khi trình duyệt cung cấp dữ liệu mà nó đã được cấp cho một trang web khác.


Tại sao Chính sách Nguồn gốc Giống nhau chỉ áp dụng cho JavaScript trong một trang web

Các phần mở rộng của trình duyệt *, tab Mạng trong các công cụ dành cho nhà phát triển trình duyệt và các ứng dụng như Postman là phần mềm được cài đặt. Họ không chuyển dữ liệu từ một trang web sang JavaScript thuộc một trang web khác chỉ vì bạn đã truy cập trang web khác đó . Cài đặt phần mềm thường có sự lựa chọn có ý thức hơn.

Không có bên thứ ba (Mallory) được coi là rủi ro.

*Các tiện ích mở rộng trình duyệt cần được viết cẩn thận để tránh các vấn đề về nguồn gốc chéo. Xem tài liệu Chrome chẳng hạn .


Tại sao bạn có thể hiển thị dữ liệu trong trang mà không cần đọc nó bằng JS

Có một số trường hợp mà trang web của Mallory có thể khiến trình duyệt lấy dữ liệu từ bên thứ ba và hiển thị dữ liệu đó (ví dụ: bằng cách thêm <img>phần tử để hiển thị hình ảnh). Tuy nhiên, JavaScript của Mallory không thể đọc dữ liệu trong tài nguyên đó, chỉ có trình duyệt của Alice và máy chủ của Bob mới có thể làm điều đó, vì vậy nó vẫn an toàn.


CORS

Các Access-Control-Allow-OriginHTTP phản ứng tiêu đề được đề cập trong các thông báo lỗi là một phần của CORS tiêu chuẩn cho phép Bob cấp một cách rõ ràng phép trang web Mallory để truy cập dữ liệu thông qua trình duyệt của Alice.

Một triển khai cơ bản sẽ chỉ bao gồm:

Access-Control-Allow-Origin: *

… Trong tiêu đề phản hồi để cho phép bất kỳ trang web nào đọc dữ liệu.

Access-Control-Allow-Origin: http://example.com/

… Sẽ chỉ cho phép một trang web cụ thể truy cập nó và Bob có thể tạo động nó dựa trên tiêu đề Origin yêu cầu để cho phép nhiều, nhưng không phải tất cả, các trang web truy cập nó.

Các chi tiết cụ thể về cách Bob đặt tiêu đề phản hồi đó phụ thuộc vào máy chủ HTTP của Bob và / hoặc ngôn ngữ lập trình phía máy chủ. Có một bộ sưu tập các hướng dẫn cho các cấu hình phổ biến khác nhau có thể hữu ích.

NB: Một số yêu cầu phức tạp và gửi một yêu cầu TÙY CHỌN trước khi khởi hành mà máy chủ sẽ phải trả lời trước khi trình duyệt gửi yêu cầu GET / POST / PUT / Bất cứ thứ gì mà JS muốn thực hiện. Việc triển khai CORS chỉ thêm Access-Control-Allow-Originvào các URL cụ thể thường gặp khó khăn bởi điều này.


Rõ ràng việc cấp quyền qua CORS là điều mà Bob chỉ làm nếu:

  • Dữ liệu không riêng tư hoặc
  • Mallory được tin cậy

Nhưng tôi không phải Bob!

Không có cơ chế tiêu chuẩn nào để Mallory thêm tiêu đề này vì nó phải đến từ trang web của Bob, mà cô ấy không kiểm soát.

Nếu Bob đang chạy một API công khai thì có thể có một cơ chế để bật CORS (có thể bằng cách định dạng yêu cầu theo một cách nhất định hoặc một tùy chọn cấu hình sau khi đăng nhập vào trang Cổng thông tin nhà phát triển cho trang web của Bob). Đây sẽ phải là một cơ chế được thực hiện bởi Bob. Mallory có thể đọc tài liệu trên trang của Bob để xem liệu có thứ gì không, hoặc cô có thể nói chuyện với Bob và yêu cầu anh thực hiện CORS.


Thông báo lỗi đề cập đến "Phản hồi cho chuyến bay trước"

Một số yêu cầu nguồn gốc chéo được đánh dấu trước .

Điều này xảy ra khi (nói một cách đại khái) bạn cố gắng thực hiện một yêu cầu có nguồn gốc chéo rằng:

  • Bao gồm thông tin xác thực như cookie
  • Không thể tạo bằng biểu mẫu HTML thông thường (ví dụ: có tiêu đề tùy chỉnh hoặc Loại nội dung mà bạn không thể sử dụng trong biểu mẫu enctype).

Nếu bạn đang thực hiện một cách chính xác một việc gì đó cần có ánh sáng

Trong những trường hợp này , phần còn lại của câu trả lời này vẫn được áp dụng nhưng bạn cũng cần đảm bảo rằng máy chủ có thể lắng nghe yêu cầu preflight (sẽ là OPTIONS(và không GET, POSThoặc bất cứ điều gì bạn đang cố gắng gửi) và phản hồi nó với quyền Access-Control-Allow-Originmà còn Access-Control-Allow-MethodsAccess-Control-Allow-Headersđể cho phép các phương thức hoặc tiêu đề HTTP cụ thể của bạn.

Nếu bạn đang kích hoạt preflight do nhầm lẫn

Đôi khi mọi người mắc lỗi khi cố gắng tạo các yêu cầu Ajax và đôi khi những sai lầm này kích hoạt nhu cầu khởi động trước. Nếu API được thiết kế để cho phép các yêu cầu có nguồn gốc chéo, nhưng không yêu cầu bất kỳ thứ gì cần đến preflight, thì điều này có thể phá vỡ quyền truy cập.

Những lỗi phổ biến gây ra điều này bao gồm:

  • cố gắng đặt Access-Control-Allow-Originvà các tiêu đề phản hồi CORS khác theo yêu cầu. Những thứ này không thuộc về yêu cầu, không làm bất cứ điều gì hữu ích (hệ thống cấp quyền sẽ là gì khi bạn có thể tự cấp quyền cho mình?) Và chỉ được xuất hiện trên phản hồi.
  • cố gắng đặt Content-Type: application/jsontiêu đề cho một yêu cầu GET không có phần thân yêu cầu để mô tả nội dung của (thường là khi tác giả nhầm lẫn Content-TypeAccept).

Trong một trong hai trường hợp này, việc loại bỏ tiêu đề yêu cầu bổ sung thường là đủ để tránh yêu cầu preflight (điều này sẽ giải quyết vấn đề khi giao tiếp với các API hỗ trợ các yêu cầu đơn giản nhưng không phải là preflight request).


Câu trả lời mờ đục

Đôi khi bạn cần thực hiện một yêu cầu HTTP, nhưng bạn không cần đọc phản hồi. ví dụ: nếu bạn đang đăng một thông báo nhật ký lên máy chủ để ghi lại.

Nếu bạn đang sử dụng các fetchAPI (chứ không phải XMLHttpRequest), sau đó bạn có thể cấu hình nó để không cố gắng để CORS sử dụng.

Lưu ý rằng điều này sẽ không cho phép bạn làm bất cứ điều gì mà bạn yêu cầu CORS làm. Bạn sẽ không thể đọc phản hồi. Bạn sẽ không thể thực hiện một yêu cầu yêu cầu khởi hành trước.

Nó sẽ cho phép bạn thực hiện một yêu cầu đơn giản, không thấy phản hồi và không điền vào Bảng điều khiển dành cho nhà phát triển với các thông báo lỗi.

Cách thực hiện được giải thích bằng thông báo lỗi Chrome đưa ra khi bạn đưa ra yêu cầu bằng cách sử dụng fetchvà không được phép xem phản hồi với CORS:

Quyền truy cập để tìm nạp tại ' https://example.com/' from origin ' https://example.net' đã bị chính sách CORS chặn: Không có Access-Control-Allow-Origintiêu đề '' trên tài nguyên được yêu cầu. Nếu phản hồi không rõ ràng đáp ứng nhu cầu của bạn, hãy đặt chế độ của yêu cầu thành 'no-cors' để tìm nạp tài nguyên khi CORS bị tắt.

Như vậy:

fetch("http://example.com", { mode: "no-cors" });

Các lựa chọn thay thế cho CORS

JSONP

Bob cũng có thể cung cấp dữ liệu bằng cách sử dụng một bản hack như JSONP , đây là cách mọi người đã thực hiện Ajax đa nguồn gốc trước khi CORS xuất hiện.

Nó hoạt động bằng cách trình bày dữ liệu dưới dạng một chương trình JavaScript đưa dữ liệu vào trang của Mallory.

Nó yêu cầu Mallory tin tưởng Bob không cung cấp mã độc hại.

Lưu ý chủ đề chung: Trang web cung cấp dữ liệu phải cho trình duyệt biết rằng trang web của bên thứ ba có thể truy cập vào dữ liệu mà nó đang gửi đến trình duyệt.

Vì JSONP hoạt động bằng cách thêm một <script>phần tử để tải dữ liệu dưới dạng chương trình JavaScript gọi một hàm đã có trong trang, nên việc cố gắng sử dụng kỹ thuật JSONP trên URL trả về JSON sẽ không thành công - thường là với lỗi CORB - vì JSON không phải là JavaScript.

Di chuyển hai tài nguyên đến một Nguồn duy nhất

Nếu tài liệu HTML mà JS chạy trong và URL đang được yêu cầu có cùng nguồn gốc (chia sẻ cùng một lược đồ, tên máy chủ và cổng) thì chúng Chính sách nguồn gốc tương tự cấp quyền theo mặc định. CORS không cần thiết.

Proxy

Mallory có thể sử dụng mã phía máy chủ để tìm nạp dữ liệu (sau đó cô ấy có thể chuyển dữ liệu từ máy chủ của mình sang trình duyệt của Alice thông qua HTTP như bình thường).

Nó sẽ:

  • thêm tiêu đề CORS
  • chuyển đổi phản hồi thành JSONP
  • tồn tại trên cùng một nguồn gốc với tài liệu HTML

Mã phía máy chủ đó có thể được viết và lưu trữ bởi bên thứ ba (chẳng hạn như CORS Anywhere). Lưu ý các tác động bảo mật của điều này: Bên thứ ba có thể giám sát ai ủy quyền những gì trên máy chủ của họ.

Bob sẽ không cần cấp bất kỳ quyền nào để điều đó xảy ra.

Không có tác động bảo mật nào ở đây vì đó chỉ là giữa Mallory và Bob. Không có cách nào để Bob nghĩ rằng Mallory là Alice và cung cấp cho Mallory những dữ liệu cần được giữ bí mật giữa Alice và Bob.

Do đó, Mallory chỉ có thể sử dụng kỹ thuật này để đọc dữ liệu công khai .

Tuy nhiên, xin lưu ý rằng việc lấy nội dung từ trang web của người khác và tự hiển thị nội dung đó có thể là vi phạm bản quyền và khiến bạn có cơ hội bị kiện.

Viết một cái gì đó không phải là một ứng dụng web

Như đã lưu ý trong phần "Tại sao Chính sách Nguồn gốc Giống nhau chỉ áp dụng cho JavaScript trong một trang web", bạn có thể tránh SOP bằng cách không viết JavaScript trong một trang web.

Điều đó không có nghĩa là bạn không thể tiếp tục sử dụng JavaScript và HTML, nhưng bạn có thể phân phối nó bằng một số cơ chế khác, chẳng hạn như Node-WebKit hoặc PhoneGap.

Tiện ích mở rộng trình duyệt

Tiện ích mở rộng trình duyệt có thể đưa tiêu đề CORS vào phản hồi trước khi Chính sách nguồn gốc giống nhau được áp dụng.

Những điều này có thể hữu ích cho sự phát triển, nhưng không thực tế cho một trang web sản xuất (yêu cầu mọi người dùng trang web của bạn cài đặt tiện ích mở rộng trình duyệt vô hiệu hóa tính năng bảo mật của trình duyệt của họ là không hợp lý).

Chúng cũng có xu hướng chỉ hoạt động với các yêu cầu đơn giản (không thành công khi xử lý các yêu cầu OPTIONS trước khi khởi hành).

Có một môi trường phát triển thích hợp với một máy chủ phát triển cục bộ thường là một cách tiếp cận tốt hơn.


Các rủi ro bảo mật khác

Lưu ý rằng SOP / CORS không giảm thiểu các cuộc tấn công XSS , CSRF hoặc SQL Injection cần được xử lý độc lập.


Tóm lược

  • Bạn không thể làm gì trong mã phía máy khách của mình để cho phép CORS truy cập vào máy chủ của người khác .
  • Nếu bạn kiểm soát máy chủ, yêu cầu đang được thực hiện để: Thêm quyền CORS vào nó.
  • Nếu bạn thân thiện với người kiểm soát nó: Yêu cầu họ thêm quyền CORS vào nó.
  • Nếu đó là một dịch vụ công cộng:
    • Đọc tài liệu API của họ để xem họ nói gì về việc truy cập nó bằng JavaScript phía máy khách:
      • Họ có thể yêu cầu bạn sử dụng các URL cụ thể
      • Họ có thể hỗ trợ JSONP
      • Họ có thể hoàn toàn không hỗ trợ truy cập nguồn gốc chéo từ mã phía máy khách (đây có thể là một quyết định có chủ ý vì lý do bảo mật, đặc biệt nếu bạn phải chuyển Khóa API được cá nhân hóa trong mỗi yêu cầu).
    • Đảm bảo rằng bạn không kích hoạt một yêu cầu khởi hành mà bạn không cần. API có thể cấp quyền cho các yêu cầu đơn giản nhưng không phải các yêu cầu được đánh dấu trước.
  • Nếu không có cách nào ở trên áp dụng được: Thay vào đó, hãy yêu cầu trình duyệt nói chuyện với máy chủ của bạn , sau đó yêu cầu máy chủ của bạn tìm nạp dữ liệu từ máy chủ khác và chuyển nó. (Ngoài ra còn có các dịch vụ được lưu trữ bên thứ ba đính kèm tiêu đề CORS với các tài nguyên có thể truy cập công cộng mà bạn có thể sử dụng).
4
Daphoque 2016-09-10 00:45.

Máy chủ đích phải cho phép yêu cầu nguồn gốc chéo. Để cho phép nó thông qua express, chỉ cần xử lý yêu cầu tùy chọn http:

app.options('/url...', function(req, res, next){
   res.header('Access-Control-Allow-Origin', "*");
   res.header('Access-Control-Allow-Methods', 'POST');
   res.header("Access-Control-Allow-Headers", "accept, content-type");
   res.header("Access-Control-Max-Age", "1728000");
   return res.sendStatus(200);
});
3
zwif 2017-11-10 01:37.

Vì điều này không được đề cập trong câu trả lời được chấp nhận.

  • Đây không phải là trường hợp cho câu hỏi chính xác này, nhưng có thể giúp những người khác tìm kiếm vấn đề đó
  • Đây là điều bạn có thể làm trong mã khách hàng của mình để ngăn lỗi CORS trong một số trường hợp .

Bạn có thể sử dụng các Yêu cầu Đơn giản .
Để thực hiện một 'Yêu cầu đơn giản', yêu cầu cần đáp ứng một số điều kiện. Ví dụ như chỉ cho phép POST, GETHEADphương pháp, cũng như chỉ cho phép một số Headers nhất định (bạn có thể tìm thấy tất cả các điều kiện ở đây ).

Nếu mã máy khách của bạn không đặt rõ ràng các Tiêu đề bị ảnh hưởng (ví dụ: "Chấp nhận") với giá trị sửa chữa trong yêu cầu, thì có thể xảy ra trường hợp một số máy khách tự động đặt các Tiêu đề này với một số giá trị "không chuẩn" khiến máy chủ không chấp nhận nó như Yêu cầu đơn giản - sẽ cung cấp cho bạn lỗi CORS.

2
Vishnu 2016-02-23 02:32.

Điều này đang xảy ra do lỗi CORS. CORS là viết tắt của Cross Origin Resource Sharing. Nói một cách dễ hiểu, lỗi này xảy ra khi chúng tôi cố gắng truy cập một miền / tài nguyên từ một miền khác.

Đọc thêm về nó tại đây: Lỗi CORS với jquery

Để khắc phục điều này, nếu bạn có quyền truy cập vào miền khác, bạn sẽ phải cho phép Access-Control-Allow-Origin trong máy chủ. Điều này có thể được thêm vào trong tiêu đề. Bạn có thể bật điều này cho tất cả các yêu cầu / miền hoặc một miền cụ thể.

Làm thế nào để yêu cầu bài đăng chia sẻ tài nguyên chéo (CORS) hoạt động hiệu quả

Những liên kết này có thể hữu ích

0
morph85 2018-12-17 20:40.

Vấn đề CORS này không được giải thích thêm (vì các nguyên nhân khác).

Tôi đang gặp sự cố này vì lý do khác nhau. Giao diện người dùng của tôi cũng đang trả về lỗi tiêu đề 'Access-Control-Allow-Origin'.

Chỉ là tôi đã trỏ sai URL nên tiêu đề này không được phản ánh đúng cách (trong đó tôi cứ cho rằng nó đã làm vậy). localhost (giao diện người dùng) -> gọi tới http không được bảo mật (được cho là https), đảm bảo rằng điểm cuối API từ giao diện người dùng đang trỏ đến đúng giao thức.

0
Subhashi 2020-02-12 01:02.

Tôi gặp lỗi tương tự trong bảng điều khiển Chrome.

Vấn đề của tôi là, tôi đã cố gắng truy cập trang web bằng cách sử dụng http://thay vì https://. Vì vậy, không có gì để sửa chữa, chỉ cần đến cùng một trang web sử dụng https.

0
HungNM2 2020-08-20 16:13.

Lỗi này khiến tôi mất 2 ngày. Tôi đã kiểm tra nhật ký Máy chủ của mình, yêu cầu / phản hồi Tùy chọn Preflight giữa trình duyệt Chrome / Edge và Máy chủ vẫn ổn. Lý do chính là phản hồi của máy chủ GET / POST / PUT / DELETE cho XHTMLRequest cũng phải có tiêu đề sau:

access-control-allow-origin: origin  

"origin" nằm trong tiêu đề yêu cầu (Trình duyệt sẽ thêm nó vào yêu cầu cho bạn). ví dụ:

Origin: http://localhost:4221

bạn có thể thêm tiêu đề phản hồi như sau để chấp nhận cho tất cả:

access-control-allow-origin: *  

hoặc tiêu đề phản hồi cho một yêu cầu cụ thể như:

access-control-allow-origin: http://localhost:4221 

Thông báo trong trình duyệt không rõ ràng để hiểu: "... Tài nguyên được yêu cầu"

lưu ý rằng: CORS hoạt động tốt cho localhost. cổng khác nhau có nghĩa là miền khác nhau. nếu bạn nhận được thông báo lỗi, hãy kiểm tra cấu hình CORS ở phía máy chủ.

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Một thương hiệu kế thừa khác có được cuộc sống mới khi những người chủ mới của Black Opal có được Hội chợ thời trang

Một thương hiệu kế thừa khác có được cuộc sống mới khi những người chủ mới của Black Opal có được Hội chợ thời trang

Desiree Rogers, trái, và Cheryl Mayberry McKissack Chuyển sang, Fenty Beauty và Pat McGrath, có một đế chế làm đẹp mới do phụ nữ làm chủ đang trỗi dậy. Sau thương vụ mua lại mỹ phẩm Black Opal vào tháng 9, đội ngũ quyền lực của Giám đốc điều hành công ty Desiree Rogers và Chủ tịch Cheryl Mayberry McKissack đã thông báo mua lại thương hiệu làm đẹp tiên phong Fashion Fair từ người sáng lập Johnson Publishing Company (JPC).

Ngoài việc trở nên vô nghĩa, các bên bộc lộ giới tính giờ đây đã trở nên chết người

Ngoài việc trở nên vô nghĩa, các bên bộc lộ giới tính giờ đây đã trở nên chết người

Đối với những người có quá nhiều thời gian, tiệc tiết lộ giới tính là một cách thú vị để không cần áp đặt những định kiến ​​hạn chế lên thai nhi trước một đối tượng bạn bè giả vờ quan tâm một cách lịch sự. Tuy nhiên, việc chỉ dựa vào những chiếc bánh nướng có màu nhân tạo để biểu thị một tiếng hoo-ha hoặc một đứa trẻ đi tè đã trở nên xa xỉ trong các bậc cha mẹ trên Instagram.

Kirstjen Nielsen đang cố gắng đổi mới bản thân với tư cách là một người phụ nữ 'nói ra sự thật cho sức mạnh'

Kirstjen Nielsen đang cố gắng đổi mới bản thân với tư cách là một người phụ nữ 'nói ra sự thật cho sức mạnh'

Hôm thứ Tư, cựu Bộ trưởng An ninh Nội địa Kirstjen Nielsen vì một lý do nào đó đã được đưa ra một diễn đàn để phát biểu tại Hội nghị thượng đỉnh Những người phụ nữ quyền lực nhất của Fortune. Và có thể đoán trước được, người phụ nữ giám sát các nỗ lực (đang diễn ra) của chính quyền Trump nhằm chia cắt các gia đình ở biên giới đã sử dụng thời gian của mình như một cơ hội để tự bảo vệ mình và tự nhận mình là người — và hãy hít thở sâu ở đây — “đã nói sự thật với quyền lực.

Toyota Racing Development sẽ cho ra mắt Supra 3000GT Concept, Massive Wing vào tháng tới

Toyota Racing Development sẽ cho ra mắt Supra 3000GT Concept, Massive Wing vào tháng tới

Vì thế hệ mới nhất của chiếc xe điều chỉnh được yêu thích trên thế giới hiện đã có mặt tại đây, nên chỉ có điều kiện là Toyota Racing Development sẽ đưa phiên bản Supra thế hệ thứ năm sửa đổi của riêng mình đến SEMA vào tháng tới. Toyota đã cho chúng tôi một gợi ý về những gì sẽ xảy ra trong tuần này: một chiếc Concept GR Supra 3000GT hiện đại.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Language