Tôi có thể thay đổi tất cả các liên kết http: // của mình thành // không?


240

Dave Ward nói,

Đây không phải là đọc chính xác, nhưng phần 4.2 của RFC 3986 cung cấp cho các URL đủ điều kiện bỏ qua giao thức (HTTP hoặc HTTPS) hoàn toàn. Khi giao thức của URL bị bỏ qua, trình duyệt sẽ sử dụng giao thức của tài liệu cơ bản thay thế.

Nói một cách đơn giản, các URL có giao thức không có giao thức này cho phép một tham chiếu như thế này hoạt động trong mọi trình duyệt bạn sẽ thử:

//ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js

Thoạt nhìn có vẻ lạ, nhưng URL URL không có giao thức này là cách tốt nhất để tham chiếu nội dung của bên thứ ba có sẵn thông qua cả HTTP và HTTPS.

Điều này chắc chắn sẽ giải quyết được một loạt các lỗi nội dung hỗn hợp mà chúng ta đang thấy trên các trang HTTP - giả sử rằng tài sản của chúng tôi có sẵn thông qua cả HTTP và HTTPS.

Đây có phải là hoàn toàn tương thích trình duyệt? Có bất kỳ cảnh báo khác?


Tôi đã đọc về kỹ thuật này tại blog IE một thời gian trước đây. Nhưng khi tôi thử nó không hoạt động tốt. Nếu trang web của tôi được phục vụ với HTTPS, trình duyệt (Chrome) vẫn đang sử dụng HTTP cho các URL không có giao thức.
Christopher Ramírez

10
CẢNH BÁO: nhớ KHÔNG BAO GIỜ người dùng URI không phân biệt trong chuyển hướng HTTP 3xx !! Tiêu đề HTTP không tương thích với định dạng URL này. Nếu bạn cần chuyển hướng tùy theo lược đồ, hãy sử dụng mod_rewrite hoặc tương tự.
dùng2596282

1
@ user2596282 Thử nghiệm trong các phiên bản hiện đại của Chrome và Firefox không đồng ý với bạn, cũng như bản sửa đổi (vẫn còn trong bản nháp) đối với HTTP 1.1. spec được xác định bởi nhóm làm việc HTTPbis (xem svn.tools.ietf.org/svn/wg/httpbis/draft-ietf-httpbis/latest/ tựa ). Có lẽ những gì bạn nói là đúng với một số trình duyệt, mặc dù; Bạn có biết điều gì đặc biệt không thành công trên các URL liên quan đến giao thức trong các tiêu đề vị trí không?
Mark Amery


Đừng sử dụng chúng, chúng xấu và dư thừa.
IllidanS4 muốn Monica trở lại vào

Câu trả lời:


204

Tôi đã kiểm tra nó kỹ lưỡng trước khi xuất bản. Trong tất cả các trình duyệt có sẵn để kiểm tra trên Ảnh chụp màn hình , tôi chỉ có thể tìm thấy một trình duyệt không xử lý URL giao thức tương đối chính xác: trình duyệt tối nghĩa * nix có tên là Dillo .

Có hai nhược điểm tôi đã nhận được phản hồi về:

  1. URL không có giao thức có thể không hoạt động như mong đợi khi bạn "mở" tệp cục bộ trong trình duyệt của mình, vì giao thức cơ sở của trang sẽ là tệp: ///. Đặc biệt là khi bạn đang sử dụng URL không có giao thức cho tài nguyên bên ngoài như tài sản được lưu trữ trên CDN. Tuy nhiên, sử dụng máy chủ web cục bộ như Apache hoặc IIS để kiểm tra http: // địa chỉ localhost hoạt động tốt.
  2. Rõ ràng có ít nhất một ứng dụng đọc nguồn cấp dữ liệu iPhone không xử lý các URL không có giao thức một cách chính xác. Tôi không biết cái nào có vấn đề hoặc mức độ phổ biến của nó. Để lưu trữ tệp JavaScript, đó không phải là vấn đề lớn vì trình đọc RSS thường bỏ qua nội dung JavaScript. Tuy nhiên, nó có thể là một vấn đề nếu bạn đang sử dụng các URL này cho phương tiện như hình ảnh bên trong nội dung cần được cung cấp qua RSS (mặc dù vậy, ứng dụng đọc đơn này trên một nền tảng có thể chiếm số lượng người đọc rất ít).

33
Mặc dù IE7 / 8 xử lý tốt các URL liên quan đến giao thức (hay còn gọi là URI không phân loại) trong hầu hết các trường hợp, khi các bảng định kiểu được chỉ định với các URL đó, nó sẽ tải xuống hai lần . ( Steve
Souder cũng

3
Tôi thấy rằng IE6 cố gắng chuyển đổi URI thành tương đối (nghĩa là loại bỏ một trong các dấu gạch chéo hàng đầu). Đây là một linkyếu tố. Ví dụ: khi chỉ định //fonts.googleapis.com/css?family=Rokkitt:400,700, IE6 cố gắng tải http://mysite.com/fonts.googleapis.com/css/<...>. Không tốt lắm!
CBono

2
Tôi đã tìm thấy từ các bản ghi nhật ký của mình về những thứ dường như là robot nhện (không rõ nguồn) đang cố gắng sử dụng các liên kết không có giao thức và cũng không xử lý chúng chính xác.
Kzqai

3
Tôi đã thấy rất nhiều điều đó trong nhật ký của mình, không liên quan đến các URL không có giao thức. Rất nhiều những con nhện đó được viết rất kém.
Dave Ward

11
Điều quan trọng là phải hiểu rằng những URL này không protocol- ít , nhưng protocol- tương đối . Họ nhận giao thức từ ngữ cảnh của họ và thiếu ngữ cảnh họ sẽ hành động như các url tệp trong hầu hết các trình duyệt, có nghĩa là họ phá vỡ ở chỗ họ sẽ không tải nội dung dự định. Mặc dù chúng sẽ hoạt động khi được gửi qua http, nhưng bạn sẽ thấy rằng nếu bạn lưu trang và tải cùng một HTML chính xác từ một tệp cục bộ, thì chúng sẽ không, vì bối cảnh là khác nhau. Các bối cảnh duy nhất bạn nên sử dụng chúng là http so với https.
Synchro

37

Câu hỏi liệu một người có thể thay đổi tất cả các liên kết của họ thành tương đối giao thức hay không có thể được đưa ra, xem xét câu hỏi liệu người ta có nên làm như vậy không. Dựa theo Paul Ailen :

2014.12.17: Bây giờ SSL được khuyến khích cho tất cả mọi người và không có mối quan tâm về hiệu suất, kỹ thuật này hiện là một mô hình chống. Nếu tài sản bạn cần có sẵn trên SSL, thì hãy luôn sử dụng tài sản https: // .


Tôi đã suy nghĩ chính xác như vậy. Điểm nào trong việc tải xuống một tài sản bên ngoài qua http nếu nó cũng có sẵn trên https - ngay cả khi trang web chính đang sử dụng http (không nên, nhưng đó là một chủ đề khác).
joonas.fi

1
@ joonas.fi điều duy nhất tôi có thể nghĩ đến là tránh các cảnh báo HTTP / HTTPS hỗn hợp có thể được tạo bởi một số trình duyệt
Ohad Schneider

3
Cảnh báo @Ohad_Schneider chỉ được kích hoạt nếu tài liệu được tải quá an toàn (https) nhưng tài sản không an toàn (http). Điều tôi đã đề xuất là bạn luôn có thể tải tài sản an toàn, ngay cả khi tài liệu được tải không an toàn. Không có cảnh báo và không có lý do để không sử dụng bảo mật, khiến toàn bộ "URL liên quan đến giao thức" không cần thiết.
joonas.fi

1
@Ohad_Schneider oh xin lỗi, tôi nghĩ rằng tôi đã hiểu sai những gì bạn đang nói. Tải tài sản qua https khi tài liệu của bạn qua http sẽ không tạo ra bất kỳ cảnh báo nào. Nhưng tải tài sản qua http khi tài liệu của bạn vượt quá https (và có thể bị chặn theo mặc định, ít nhất là trong Chrome). Bạn đã đề cập đến trường hợp bạn phục vụ trang web của mình qua https và tài sản bên ngoài chỉ có sẵn dưới http? Vâng, đó có thể là một vấn đề nhưng tôi không nghĩ rằng có bất kỳ dịch vụ nghiêm túc nào của bên thứ 3 không phục vụ nội dung của họ qua https, nếu không họ sẽ không hoạt động. :)
joonas.fi

@ joonas.fi? O_o Nếu ai đó có URL tương đối của giao thức HTTPSed (sau đó) sẽ không giúp giải quyết việc nhận tài sản của bên thứ 3 qua HTTP - không có cách nào. Và dù sao, tốt hơn hết là không có logo SSL màu xanh lá cây sạch trên trang HTTPS của bạn hơn là cung cấp lại cho HTTP trở lại chỉ vì các bên thứ 3 chưa hỗ trợ HTTPS.
poige


15

Có, tham chiếu đường dẫn mạng đã được chỉ định trong RFC 1808 và sẽ hoạt động với tất cả các trình duyệt.


11
Nó thậm chí còn được đề xuất và sử dụng trong mã soạn sẵn HTML5: html5boilerplate.com
Felipe Lima

1
whit Có, bạn không trả lời Có cho "Có bất kỳ cảnh báo nào khác không?" ? ;)
Caspar Kleijne

2
@Caspar Kleijne: Tôi đã giải thích Có với phần còn lại của câu.
Gumbo

1
Casper, Gumbo đã thực sự trả lời hai câu hỏi được hỏi: "Điều này có hoàn toàn tương thích với trình duyệt không? Có bất kỳ cảnh báo nào khác không?" Có là câu trả lời cho câu hỏi đầu tiên.
Darren Griffith

4

Đây có phải là hoàn toàn tương thích trình duyệt? Có bất kỳ cảnh báo khác?

Chỉ cần ném cái này vào hỗn hợp, nếu bạn đang phát triển trên một máy chủ cục bộ, nó có thể không hoạt động. Bạn cần chỉ định một lược đồ, nếu không trình duyệt có thể cho rằng đó src="//cdn.example.com/js_file.js"src="file://cdn.example.com/js_file.js" , sẽ phá vỡ kể từ khi bạn không lưu trữ tài nguyên này tại địa phương.

Microsoft Internet Explorer dường như đặc biệt nhạy cảm với điều này, hãy xem câu hỏi này: Không thể tải jQuery trong Internet Explorer trên localhost (WAMP)

Bạn có thể sẽ luôn cố gắng tìm một giải pháp hoạt động trên tất cả các môi trường của bạn với số lượng sửa đổi ít nhất cần thiết.

Giải pháp được sử dụng bởi HTML5Boilerplate là dự phòng khi tài nguyên không được tải chính xác, nhưng nó chỉ hoạt động nếu bạn kết hợp kiểm tra:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<!-- If jQuery is not defined, something went wrong and we'll load the local file -->
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>

Tôi đã đăng câu trả lời này ở đây là tốt.

CẬP NHẬT: HTML5Boilerplate hiện sử dụng <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">sau khi quyết định loại bỏ các URL tương đối của giao thức, xem tại đây .


1

Tôi chưa gặp phải những vấn đề này khi sử dụng: //domain.com - nhưng bạn cần phải thêm dấu hai chấm ở đầu. Yoast đã có một bài viết tốt về điều này một thời gian trở lại. Nhưng nó đã bị mất trong đống bài viết trên blog của anh ấy.


bỏ phiếu không nêu rõ nơi bổ sung: là hữu ích. Ở mọi nơi tôi vô tình để lại dấu ":" đã phá vỡ liên kết
cướp

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.