Tại sao bạn lại sử dụng document.location.protatio thay vì // url tiền tố đơn giản?


11

Chẳng hạn, Google Analytics sử dụng document.location.protatio trong bản tóm tắt để theo dõi:

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXX-X']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

thay vì

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXX-X']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = '//www.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

Các ssl. tên miền phụ là một đối số câm vì https://www.google-analytics.com/ga.js hoạt động hoàn toàn tốt.

Biết Google điều này rất có thể không phải là một giám sát. Có vấn đề gì với một số trình duyệt không hỗ trợ giao thức // tôn vinh tốc ký hay còn thiếu điều gì khác không?

EDIT: Điều này không chỉ áp dụng cho Google Analytics (ví dụ về tên miền phụ khác nhau). Điều tương tự cũng xuất hiện trên trang API Trình tải phông chữ :

wf.src = ('https:' == document.location.protocol ? 'https' : 'http') +
    '://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';

Có thể nhận được phản hồi tốt hơn khi đọc lại câu hỏi của bạn để hỏi về vấn đề kỹ thuật thay vì lý do tại sao Google làm điều gì đó. Bạn sẽ không nhận được câu trả lời thực sự cho lần thứ hai (trừ khi chúng ta thấy một phản hồi khác của Google ở ​​đây, sẽ rất tuyệt).
JasonBirch

Chỉnh sửa nhẹ trong một nỗ lực để làm cho nó bất khả tri hơn. Bất cứ một đề nghị nào khác?
Metalshark

Câu trả lời:


3

Thật vậy, đó không phải là sự giám sát của Nhóm GA!
Trình tải GA tải một tập lệnh, do đó không bị ảnh hưởng bởi lỗi tải xuống kép trên một <link>hoặc @importcho một bảng định kiểu trong IE7 / IE8.

Họ sử dụng toán tử có điều kiện (ternary) document.location.protocol vì lỗi trường hợp biên trong IE6 khiến hộp thoại bảo mật bật lên dưới một số cài đặt bảo mật nhất định khi yêu cầu từ tên miền phụ không phải của , như Paul Irish (người đã làm việc cùng với nhà phát triển javascript Google Analytics về vấn đề này) trên blog của mình: https://www.paulirish.com/2010/the-protatio-relative-url/ từ đó tôi trích dẫn bên dưới:
Hình ảnh hộp thoại bảo mật bảo mật IE6, nguồn: http://paulirish.com/i/7b01.png

2011.01,23: Nhưng ... còn việc sử dụng điều này trên đoạn mã Google Analytics thì sao?
Tất nhiên, điều đó sẽ không tốt ... Vì vậy, tôi đã làm việc với nhà phát triển khách hàng javascript của Google Analytics (Chúa ơi, tôi thích làm việc tại google) để xem liệu chúng tôi có thể làm điều này không ... hóa ra chúng tôi không thể. Có một lỗi edgecase trong IE6 khiến hộp thoại nổ tung ... trong một số cài đặt bảo mật (không chắc chắn nếu chúng là mặc định) khi yêu cầu từ tên miền phụ không phải là 's'. ảnh chụp màn hình ở đây . Vì vậy, hãy thoải mái lấy 40 byte khỏi đoạn mã GA của bạn nếu bạn không quan tâm đến IE6 .. nếu không bạn sẽ cần nhà điều hành tạm thời đó. `:)`
2011.12.24. Eric Law (từ nhóm IE) nói về lý do tại sao IE6 không chơi tốt GA ...
Lý do điều này không hoạt động trong IE6 là máy chủ đang sử dụng SNI để suy ra chứng chỉ nào sẽ trả về. XP (và do đó IE6) không hỗ trợ SNI trong ngăn xếp HTTPS . Xem để biết chi tiết .


1

Bạn đã chỉ ra sự khác biệt trong trường hợp Google Analytics, cụ thể là phiên bản bảo mật được bật https://ssl.thay vì http://www.. Mặc dù phiên bản bảo mật của www có thể hoạt động, nhưng nó cũng có thể khác với phiên bản ssl:

  • Giấy chứng nhận khác nhau cho phiên bản ssl và phiên bản www.
  • Mã khác nhau trên mỗi phiên bản.
  • Các bộ cookie khác nhau, dành riêng cho miền SSL.

Tôi không biết nếu bất kỳ trong số này áp dụng cho Google mặc dù. Nhìn thoáng qua, mã trông giống nhau.


Một ví dụ khác là trình tải phông chữ code.google.com/apis/webfonts/docs/webfont_loader.html ở đây không có sự khác biệt trong tên miền. Mỗi ví dụ mẫu mã của mã của họ theo cùng một mẫu.
Metalshark

Trong trường hợp đó, họ đang sử dụng cùng một tên miền. Có thể có một số trình duyệt cổ xưa không nhận ra //giao thức?
DisgruntledGoat

Đó là suy nghĩ, nhưng cái nào, quan trọng hơn cái nào cũng hỗ trợ phông chữ web? Liệu nó có cho phép hành vi song song hơn (kiểu vật lý lượng tử, bằng cách đọc proto nó làm thay đổi trạng thái của trình duyệt)? Tôi đã kiểm tra kỹ lưỡng và vẫn chưa thấy logic ...
Metalshark

0

Câu trả lời Stack Overflow này làm cho một số điểm tốt.

Điều quan trọng là phải chỉ định rõ ràng giao thức để tài sản đích được tải chính xác trong tài liệu được mở từ ổ đĩa cục bộ ( file:) hoặc khi sử dụng "ma thuật iframe" ( about:).


0

//www.google-analytics.com/ga.jskhông phải là một URL theo tiêu chuẩn của nó, vì nó thiếu lược đồ, điều này là bắt buộc. Nó hoạt động và được sử dụng, nhưng nó vẫn không tuân thủ tiêu chuẩn URL.

Xem RFC3986 §3:

Các thành phần lược đồ và đường dẫn được yêu cầu, mặc dù đường dẫn có thể trống (không có ký tự). Khi có thẩm quyền, đường dẫn phải trống hoặc bắt đầu bằng ký tự gạch chéo ("/"). Khi không có thẩm quyền, đường dẫn không thể bắt đầu bằng hai ký tự gạch chéo ("//").


Lược đồ không bắt buộc khi nó giống nhau trong các trình duyệt.
Metalshark

Vui lòng đọc RFC: chương trình này là bắt buộc trong tất cả các URL. Điều này không liên quan đến những gì xảy ra với công việc, tiêu chuẩn chỉ nói khác đi và có những sai lệch trong tự nhiên.
Patrick Mevzek
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.