Tất cả các câu trả lời cho đến nay dường như sai một phần hoặc không đầy đủ (chủ đề rất phức tạp, mọi thứ được đặt tên khó hiểu và không được ghi chép rõ ràng!), Vì vậy đây là cách hiểu của tôi:
Để có thể sử dụng lại kết nối được tạo bởi <link rel=preconnect>
, mọi thứ phụ thuộc vào loại nội dung bạn muốn tìm nạp, từ đâu, liệu yêu cầu sẽ gửi thông tin xác thực của trình duyệt (có thể được trình duyệt xác lập rõ ràng hoặc ẩn):
Yêu cầu có cùng nguồn gốc ( example.com
yêu cầu nguồn phụ từexample.com
)
Không cần thiết preconnect
ở nơi đầu tiên; trình duyệt giữ kết nối mở sau khi tải trang khá lâu.
để được kiểm tra : điều gì xảy ra nếu yêu cầu cùng nguồn gốc có crossorigin
thuộc tính: nó được sử dụng hay bỏ qua?
Yêu cầu có nguồn gốc chéo ( example.com
yêu cầu nguồn phụ từ another.com
)
- nếu yêu cầu thực tế (trong HTML hoặc thông qua JS) có
crossorigin
thuộc tính được đặt rõ ràng ( crossOrigin
trong trường hợp JS là quan trọng), thì kết nối trước cũng phải có nó, với cùng một giá trị (có lẽ ngoại trừ trong trường hợp không có ý nghĩa và crossorigin
bị bỏ qua - - chưa hoàn toàn rõ ràng cho tôi)
- khác, nếu yêu cầu nếu cho
<script type=module>
: được kiểm tra
- khác, nếu yêu cầu là và "trường cũ" đề nghị
<img>
, <style type=stylesheet>
, <iframe>
, cổ điển <script>
vv (khởi xướng qua HTML hoặc JS) mà không crossorigin
quy định một cách rõ ràng , thì preconnect không có crossorigin
bộ thuộc tính.
- khác, nếu yêu cầu là một yêu cầu phông chữ chéo , kết nối phải có
crossorigin=anonymous
- khác, nếu yêu cầu là nguồn gốc chéo
fetch
hoặc XHR
:
- nếu nó được thực hiện trong chế độ xác thực (ví dụ: cookie được đính kèm hoặc xác thực cơ bản HTTP được sử dụng; trong trường hợp tìm nạp, điều này có nghĩa là
credentials !== omit
, trong trường hợp XHR withCredentials === true
:): phải kết nối trướccrossorigin=use-credentials
- nếu nó không ở chế độ xác thực: phải kết nối trước
crossorigin=anonymous
Đối với trường hợp cuối cùng (tìm nạp / XHR), hãy chuyển đến bảng điều khiển mạng trong devtools Chrome / Firefox, nhấp chuột phải vào yêu cầu và chọn copy as fetch
từ danh sách thả xuống. Điều này sẽ tạo một đoạn mã JS, nó sẽ cho bạn biết nếu yêu cầu đó được kích hoạt CORS ( "mode"=="cors"
) và được chứng nhận ( "credentials"=="include"|"same-origin"
).
Tuy nhiên, xin lưu ý rằng mẹo trên không hoạt động chính xác cho các yêu cầu không XHR / tìm nạp, vì ví dụ fetch
và <img>
sử dụng các thuật toán khác nhau để thiết lập kết nối, như đã giải thích trước đây.
Cuối cùng, trong HTML, <link ...crossorigin>
=== <link ...crossorigin=anonymous>
.
Ghi chú và liên kết bổ sung: