Liên kết và thực thi tệp JavaScript bên ngoài được lưu trữ trên GitHub


546

Khi tôi cố gắng thay đổi tham chiếu được liên kết của tệp JavaScript cục bộ thành phiên bản thô GitHub, tệp thử nghiệm của tôi sẽ ngừng hoạt động. Lỗi là:

Từ chối thực thi tập lệnh từ ... vì loại MIME ( text/plain) của nó không thể thực thi được và kiểm tra loại MIME nghiêm ngặt được bật.

Có cách nào để vô hiệu hóa hành vi này hay có dịch vụ nào cho phép liên kết đến các tệp thô GitHub không?

Mã làm việc:

<script src="bootstrap-wysiwyg.js"></script>

Mã không hoạt động:

<script src="https://raw.github.com/mindmup/bootstrap-wysiwyg/master/bootstrap-wysiwyg.js"></script>

3
rawgit.com là tên miền mới bây giờ
Muhammad Umer


1
@MuhammadUmer - chỉ khi các tệp nguồn của bạn không bao giờ thay đổi . rawgitbộ nhớ cache không bao giờ cập nhật .
vsync

3
2019: CHỈ CÒN SKIP TẤT CẢ CÁC TRẢ LỜI GỬI RAW hoặc RAWGIT. Rawgit đã chết. Đi xuống câu trả lời từ chharwey và nâng cấp nó cho đến khi nó lên đến đỉnh. Đó là một điều tốt: đơn giản nhất, sử dụng phương pháp ưa thích chính thức của GitHub.
Marco Faustinelli

1
Sử dụng jsdelivr.com/?docs=gh , nó hoạt động
AuthorProxy

Câu trả lời:


1018

một cách giải quyết tốt cho điều này, bây giờ, bằng cách sử dụng jsdelivr.net .

Các bước :

  1. Tìm liên kết của bạn trên GitHub và nhấp vào phiên bản "Nguyên".
  2. Sao chép URL.
  3. Thay đổi raw.githubusercontent.comthànhcdn.jsdelivr.net
  4. Chèn /gh/trước tên người dùng của bạn.
  5. Xóa branchtên.
  6. (Tùy chọn) Chèn phiên bản bạn muốn liên kết đến, vì @version(nếu bạn không làm điều này, bạn sẽ nhận được phiên bản mới nhất - có thể gây ra bộ nhớ đệm dài hạn)

Ví dụ :

http://raw.githubusercontent.com/<username>/<repo>/<branch>/path/to/file.js

Sử dụng URL này để có phiên bản mới nhất:

http://cdn.jsdelivr.net/gh/<username>/<repo>/path/to/file.js

Sử dụng URL này để có được một phiên bản cụ thể hoặc cam kết băm:

http://cdn.jsdelivr.net/gh/<username>/<repo>@<version or hash>/path/to/file.js

Đối với môi trường sản xuất , hãy xem xét nhắm mục tiêu một thẻ cụ thể hoặc cam kết băm hơn là chi nhánh. Sử dụng liên kết mới nhất có thể dẫn đến bộ đệm ẩn dài hạn của tệp, khiến liên kết của bạn không được cập nhật khi bạn đẩy các phiên bản mới. Liên kết đến một tệp bằng cam kết băm hoặc thẻ làm cho liên kết duy nhất với phiên bản.


tại sao nó cần thiết?

Năm 2013, GitHub bắt đầu sử dụng X-Content-Type-Options: nosniff , hướng dẫn các trình duyệt hiện đại hơn để thực thi kiểm tra loại MIME nghiêm ngặt. Sau đó, nó trả về các tệp thô trong loại MIME được máy chủ trả về, ngăn trình duyệt sử dụng tệp theo dự định (nếu trình duyệt tôn trọng cài đặt).

Đối với nền tảng về chủ đề này, xin vui lòng tham khảo chủ đề thảo luận này .


14
Cũng hoạt động cho ý chính. Tôi đã có thể thay thế gist.githubusercontent.comvới rawgist.comvà nhận nó làm việc.
haridsv

3
Tôi không biết ai bảo vệ trang này rawgit, nhưng không sử dụng nó trong sản xuất. Bạn sẽ có một bên thứ ba không xác định có thể tiêm bất kỳ javascript nào vào trang web của bạn.
Neves

1
@Maciej Krawchot - có - trang rõ ràng khuyến khích bạn sử dụng một liên kết cụ thể theo cam kết, thay vì liên kết chi nhánh, vì chính xác lý do này.
Troy Alford

4
rawgit hiện đã ngừng (kể từ 2018-10-08): rawgit.com . khuyên bạn nên cập nhật câu trả lời này.
chharvey

1
Cảm ơn bạn đã chỉ ra @chharvey - Tôi đã cập nhật câu trả lời để phản ánh jsdelivr.net
Troy Alford


25

rawgithub.comchuyển hướng đến rawgit.comVì vậy, ví dụ trên bây giờ sẽ là

http://rawgit.com/user/package/master/link.min.js


Truy cập rawgit.com và dán url cho tệp hoặc ý chính. Nó sẽ tạo ra một url hợp lệ cho bạn.
Marcelo Vani

8
rawgit hiện đã ngừng (kể từ 2018-10-08): rawgit.com . khuyên bạn nên cập nhật câu trả lời này.
chharvey

10

Trang GitHub là giải pháp chính thức của GitHub cho vấn đề này.

raw.githubusercontentlàm cho tất cả các tệp sử dụng text/plainloại MIME, ngay cả khi tệp là tệp CSS hoặc JavaScript. Vì vậy, https://raw.githubusercontent.com/‹user›/‹repo›/‹branch›/‹filepath›sẽ không phải là loại MIME chính xác mà thay vào đó là một tệp văn bản gốc và liên kết nó thông qua <link href="..."/>hoặc <script src="..."></script>sẽ không hoạt động. CSS sẽ không áp dụng / JS sẽ không chạy.

Trang GitHub lưu trữ repo của bạn tại một URL đặc biệt, vì vậy tất cả những gì bạn phải làm là đăng ký các tệp của mình và đẩy. Lưu ý rằng trong hầu hết các trường hợp, Trang GitHub yêu cầu bạn phải cam kết với một nhánh đặc biệt , gh-pages.

Trên trang web mới của bạn, thông thường https://‹user›.github.io/‹repo›, mọi tệp được cam kết cho gh-pageschi nhánh (cam kết gần đây nhất) có mặt tại url này. Vì vậy, sau đó bạn có thể liên kết đến tệp js của mình thông qua <script src="https://‹user›.github.io/‹repo›/file.js"></script>và đây sẽ là loại MIME chính xác.

Bạn có xây dựng tập tin?

Cá nhân, đề nghị của tôi là chạy chi nhánh này song song master. Trên gh-pagesnhánh, bạn có thể chỉnh sửa .gitignoretập tin để kiểm tra tại tất cả các quận / build file bạn cần cho trang web của bạn (ví dụ: nếu bạn có bất kỳ minified / tập tin biên dịch), trong khi giữ cho chúng phớt lờ trên của bạnmaster nhánh . Điều này hữu ích vì bạn thường không muốn theo dõi các thay đổi trong tệp xây dựng trong repo thông thường của mình. Mỗi khi bạn muốn cập nhật các tệp được lưu trữ của mình, chỉ cần hợp nhất mastervào gh-pages, xây dựng lại, cam kết và sau đó đẩy.

(protip: bạn có thể hợp nhất và xây dựng lại trong cùng một cam kết với các bước này :)

$ git checkout gh-pages
$ git merge --no-ff --no-commit master  # prepare the merge but dont commit it (as if there were a merge conflict)
$ npm run build                         # (or whatever your build process is)
$ git add .                             # stage the newly built files
$ git merge --continue                  # commit the merge
$ git push origin gh-pages

8

Các câu trả lời ở trên trả lời rõ ràng câu hỏi nhưng tôi muốn cung cấp một cách khác - Một cách nhìn / cách tiếp cận khác để giải quyết vấn đề tương tự.

Bạn cũng có thể sử dụng tiện ích mở rộng trình duyệt để xóa X-Content-Type-Optionstiêu đề phản hồi cho raw.githubusercontent.comcác tệp. Có một số phần mở rộng trình duyệt để sửa đổi tiêu đề phản hồi.

  1. Yêu cầu: Chrome + Firefox
  2. Sửa đổi tiêu đề: Firefox

Nếu bạn sử dụng Requestly, tôi có thể đề xuất hai giải pháp

Giải pháp 1: Sử dụng Quy tắc sửa đổi tiêu đề và xóa tiêu đề phản hồi

Các bước

  1. Cài đặt Requestly từ http://www.requestly.in
  2. Chuyển đến trang quy tắc
  3. Nhấp vào Thêm biểu tượng để tạo quy tắc
  4. Chọn Sửa đổi Tiêu đề
  5. Đặt tên và mô tả
  6. Chọn Remove-> Response->X-Content-Type-Options
  7. Trong trường Nguồn, nhập Url-> Contains->raw.githubusercontent.com

Giải pháp 2: Sử dụng Thay thế quy tắc máy chủ

  1. Cài đặt Requestly từ http://www.requestly.in
  2. Chuyển đến trang quy tắc
  3. Nhấp vào Thêm biểu tượng để tạo quy tắc
  4. Thay thế raw.githubusercontent.combằngrawgit.com

Kiểm tra ảnh chụp màn hình này để biết thêm chi tiếtnhập mô tả hình ảnh ở đây

Làm thế nào để kiểm tra

Chúng tôi đã tạo một Fiddle JS đơn giản để kiểm tra xem chúng tôi có thể sử dụng các tệp github thô làm tập lệnh trong mã của chúng tôi hay không. Đây là Fiddle với đoạn mã sau

<center id="msg"></center>

<script src="https://raw.githubusercontent.com/sachinjain024/practicebook/master/web-extensions-master/storage/background.js"></script>
<script>
try {
  if (typeof BG.Methods !== 'undefoned') {
    document.getElementById('msg').innerHTML = 'Script evaluated successfully!';
  }
} catch (e) {
  document.getElementById('msg').innerHTML = 'Problem evaluating script';
}
</script>

Nếu bạn thấy Script evaluated successfully!, Điều đó có nghĩa là bạn có thể sử dụng tệp github thô trong mã của mình Nếu không Problem evaluating scriptchỉ ra rằng có một số vấn đề trong khi thực thi tập lệnh từ nguồn github thô.

Tôi cũng đã viết một bài viết trên blog Yêu cầu về điều này. Vui lòng tham khảo nó để biết thêm chi tiết.

Hy vọng nó giúp!!

Tuyên bố miễn trừ trách nhiệm: Tôi là tác giả của Requestly Vì vậy, bạn có thể đổ lỗi cho bất cứ điều gì bạn không thích.



5

Để làm cho mọi thứ rõ ràng và ngắn gọn

//raw.githubusercontent.com -> //rawgit.com

Lưu ý rằng điều này được xử lý bởi lưu trữ phát triển của rawgit chứ không phải cdn của họ cho lưu trữ sản xuất


URL thô mặc định dường như đã thay đổi vì câu trả lời này vì vậy hiện tại chuyển đổi https://raw.githubusercontent.com-> https://rawgit.comNếu không, câu trả lời này là rõ ràng nhất và hoạt động.
mikeym

4
rawgit hiện đã ngừng (kể từ 2018-10-08): rawgit.com . khuyên bạn nên cập nhật câu trả lời này.
chharvey

4

Trường hợp sử dụng của tôi là để tải ' direclty ' bookmarklets ' từ tài khoản Bitbucket của tôi có các hạn chế tương tự như Github. Công việc xung quanh tôi đã đưa ra là AJAX cho tập lệnh và chạy evaltrên chuỗi phản hồi, bên dưới đoạn trích dựa trên cách tiếp cận đó.

<script>
    var sScriptURL ='<script-URL-here>'; 
    var oReq = new XMLHttpRequest(); 
    oReq.addEventListener("load", 
       function fLoad() {eval(this.responseText + '\r\n//# sourceURL=' + sScriptURL)}); 
    oReq.open("GET", sScriptURL); oReq.send(); false;
</script>

Lưu ý rằng việc nối thêm sourceURL nhận xét là để cho phép gỡ lỗi tập lệnh trong các công cụ dành cho nhà phát triển của trình duyệt.


1

Khi một tệp được tải lên github, bạn có thể sử dụng nó làm nguồn bên ngoài hoặc lưu trữ miễn phí. Troy Alford đã giải thích nó tốt ở trên. Nhưng để làm cho nó dễ dàng hơn, hãy để tôi nói cho bạn một số bước dễ dàng sau đó bạn có thể sử dụng tệp thô github trong trang web của mình:

Đây là liên kết tập tin của bạn:

https://raw.githubusercontent.com/mindmup/bootstrap-wysiwyg/master/bootstrap-wysiwyg.js

Bây giờ để thực thi nó, bạn phải xóa https: // và dấu chấm (.) Giữa rawgithubusercontent

Như thế này:

rawgithubusercontent.com/mindmup/bootstrap-wysiwyg/master/bootstrap-wysiwyg.js

Bây giờ khi bạn truy cập liên kết này, bạn sẽ nhận được một liên kết có thể được sử dụng để gọi javascript của bạn:

Đây là liên kết cuối cùng:

https://rawgit.com/mindmup/bootstrap-wysiwyg/master/bootstrap-wysiwyg.js

Tương tự như vậy nếu bạn lưu trữ một tập tin css, bạn phải làm điều đó như đã đề cập ở trên. Đây là cách dễ nhất để có được liên kết đơn giản để gọi tệp css hoặc javascript bên ngoài của bạn được lưu trữ trên github.

Tôi hy vọng điều này là hữu ích.

URL giới thiệu: http://101helper.blogspot.com/2015/11/store-blogger-codes-on-github-boost-blogger-speed.html


3
rawgit hiện đã ngừng (kể từ 2018-10-08): rawgit.com . khuyên bạn nên cập nhật câu trả lời này.
chharvey

1

Tôi thấy lỗi đã được hiển thị do các nhận xét ở đầu tệp. Bạn có thể giải quyết vấn đề này, chỉ bằng cách tạo tệp của riêng bạn mà không cần nhận xét và đẩy sang git, nó không hiển thị lỗi

Để chứng minh, bạn có thể thử hai tệp này với cùng một mã phân trang dễ dàng:

không một lời bình

với bình luận


1

Tôi có cùng một vấn đề với bạn, những gì tôi đã làm là thay đổi thành

<script type="application/javascript" src="bootstrap-wysiwyg.js"></script>

Nó làm việc cho tôi.


thay đổi từ cái gì sang cái gì? vui lòng hiển thị trước và sau
Alexander Mills

0

Cách đơn giản nhất: Được
<script type="text/plain" src="http://raw.githubusercontent.com/user/repo/branch/file.js"></script>
phục vụ bởi GitHub

rất

đáng tin cậy
với text/plain
nhập mô tả hình ảnh ở đây Withouttext/plain
nhập mô tả hình ảnh ở đây


Đây là giải pháp tốt nhất, nó chỉ hoạt động và có ý nghĩa rất nhiều.
a20

2
Không. tất cả những điều này là ngăn không cho kịch bản chạy ngay cả
Steven Penny

2
Nó sẽ không hoạt động sớm nữa. Từ logcat thiết bị Android của tôi: "Tìm nạp các tập lệnh có thuộc tính loại / ngôn ngữ không hợp lệ sẽ không được chấp nhận và sẽ bị xóa trong M56, vào khoảng tháng 1 năm 2017. Xem chromestatus.com/features/5760718284521472 để biết thêm chi tiết."
Jens Hauke

0

raw.github.comkhông thực sự là quyền truy cập thô vào tài sản tệp, mà là chế độ xem được hiển thị bởi Rails. Vì vậy, truy cập raw.github.comlà nặng hơn nhiều so với cần thiết. Tôi không biết tại sao raw.github.comđược triển khai dưới dạng Rails. Thay vì khắc phục sự cố lộ trình này, GitHub đã thêm một X-Content-Type-Options: nosnifftiêu đề.

Cách giải quyết:

  • Đặt kịch bản cho user.github.io/repo
  • Sử dụng CDN của bên thứ ba như rawgit.com.

Đối với bất cứ ai khác bối rối bởi điều này, họ đã cố tình làm điều đó. Bạn đã từng có thể chỉ đơn giản là sử dụng raw.github.comđể tải các tệp - và sau đó github nhận ra rằng chúng đang được sử dụng như một CDN, điều này khiến chúng có quá nhiều lưu lượng truy cập. Kết quả là, họ đã thay đổi nó thành loại kết xuất này với X-Content-Type-Options: nosnifftiêu đề, đặc biệt để ngăn mọi người sử dụng dịch vụ của họ theo cách đó.
Troy Alford

0

Ngoài ra, nếu tạo phía máy chủ đánh dấu của bạn, bạn chỉ có thể tìm nạp và tiêm. Ví dụ: trong JSTL bạn có thể làm điều này:

<script type="text/javascript">
    <c:import url="https://raw.github.com/mindmup/bootstrap-wysiwyg/master/bootstrap-wysiwyg.js" />
</script>

Họ không cho phép liên kết nóng vì một lý do, vì vậy có thể là hình thức xấu nếu bạn muốn trở thành một công dân tốt. Tôi khuyên bạn nên lưu trữ bộ đệm javascript đó và chỉ thực sự tìm nạp lại định kỳ khi bạn thấy phù hợp.


0

Thí dụ


nguyên

https://raw.githubusercontent.com/antelove19/qrcodejs/master/qrcode.min.js

cdn.jsdelivr.net

https://cdn.jsdelivr.net/gh/antelove19/qrcodejs/qrcode.min.js
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.