Phát hiện HTTP hoặc HTTPS sau đó buộc HTTPS bằng JavaScript


298

Có cách nào để phát hiện HTTP hoặc HTTPS và sau đó bắt buộc sử dụng HTTPS với JavaScript không?

Tôi có một số mã để phát hiện HTTP hoặc HTTPS nhưng tôi không thể buộc nó sử dụng https:.

Tôi đang sử dụng thuộc tính window.location.protatio để đặt bất kỳ trang web nào https:sau đó làm mới trang để hy vọng tải lại URL https mới được tải vào trình duyệt.

if (window.location.protocol != "https:") {
   window.location.protocol = "https:";
   window.location.reload();
}

15
Điều này đáng tin cậy hơn nhiều (và hiệu quả) phía máy chủ xử lý.
Quentin

3
Tôi nghĩ bạn đúng. Là một kẻ tấn công sử dụng một cuộc tấn công MITM, tôi chỉ có thể xóa mã này. Vì vậy, nó chỉ cung cấp bảo vệ chống lại các cuộc tấn công thụ động.
ndevln


1
@NeoDevlin một kẻ tấn công MITM trên http cũng có thể thay thế chuyển hướng phía máy chủ
Alex Lehmann

1
Chính xác. Năm 2018, không có lý do gì để không sử dụng HSTS. Đây là cách an toàn duy nhất để buộc HTTPS.

Câu trả lời:


500

Thử cái này

if (location.protocol !== 'https:') {
    location.replace(`https:${location.href.substring(location.protocol.length)}`);
}

location.href = blahthêm chuyển hướng này vào lịch sử trình duyệt. Nếu người dùng nhấn nút quay lại, họ sẽ được chuyển hướng trở lại cùng một trang. Nó là tốt hơn để sử dụng location.replacevì nó không thêm chuyển hướng này vào lịch sử trình duyệt.


3
Tại sao windowvà không document?
webjay


11
Có nên so sánh chuỗi !==?
Wes Turner

5
@WesTurner Nó cũng không thành vấn đề. Cả hai luôn luôn là chuỗi. Nếu một là một số hoặc một boolean, thì nó có thể tạo ra sự khác biệt.
Soumya

15
location.replace(url)sẽ tốt hơn nhiều so location.href = urlvới trường hợp này Bạn không muốn chuyển hướng này trong lịch sử của trình duyệt hoặc người dùng nhấn nút quay lại chỉ để được chuyển hướng một lần nữa.
Francisco Zarabozo

59

Đặt location.protatio điều hướng đến một URL mới . Không cần phải phân tích / cắt bất cứ điều gì.

if (location.protocol !== "https:") {
  location.protocol = "https:";
}

Firefox 49 có một lỗi nơi httpshoạt động nhưng https:không. Được cho là đã được sửa trong Firefox 54 .


2
if window.location.href.match('http:') window.location.href = window.location.href.replace('http', 'https')hoạt động trên FF và Chrome mới nhất.
Martin Stannard

2
location.protocol = "https";dường như hoạt động mặc dù trong firefox 28
Nick Russler

1
Crap mà phá vỡ nút quay lại. Sử dụng location.replacethay thế.
Tinh tinh hiếu chiến

22

Đó không phải là ý tưởng hay vì bạn chỉ tạm thời chuyển hướng người dùng sang https và trình duyệt không lưu chuyển hướng này.

Bạn mô tả tác vụ cho máy chủ web (apache, nginx, v.v.) http 301, http 302


3
đồng ý. Buộc https trên máy chủ đáng tin cậy hơn nhiều
Hoàng Long

3
Tôi có thể thấy nó đang được sử dụng nếu bảo toàn giá trị băm là quan trọng. Nó không được gửi đến máy chủ và một số trình duyệt không bảo quản nó.
Jason Rice

Dưới đây là một liên kết đến trang web Set Azure cho https chỉ ... blogs.msdn.com/b/benjaminperkins/archive/2014/01/07/...
OzBob

1
Không nhất thiết phải đúng. Có một trường phái cho rằng 301 là ác quỷ vì lý do lưu trữ. getluky.net/2010/12/14/301-redirects-cannot-be-undon
fivingogit

2
Mặc dù sự thật là nó không phải là một ý tưởng tốt để làm phía khách hàng này, đây không phải là những gì được yêu cầu. Và bạn không chỉ ra cách thực hiện, do đó đây không phải là câu trả lời. Ngoài ra, trong những ngày của các trang web tĩnh, thường không có cách nào để làm phía máy chủ này (nghĩ các trang Github), có nghĩa là bạn phải làm điều này trên máy khách. Tuy nhiên, bạn có thể giúp cải thiện tìm kiếm bằng cách thêm các thẻ liên kết chính tắc để tránh mọi người nhấn phiên bản không ssl.
oligofren

16

Còn cái này thì sao?

if (window.location.protocol !== 'https:') {
    window.location = 'https://' + window.location.hostname + window.location.pathname + window.location.hash;
}

Tuy nhiên, lý tưởng nhất là bạn sẽ làm điều đó ở phía máy chủ.


nó thiếu cổng
eadmaster

13
if (location.protocol == 'http:')
  location.href = location.href.replace(/^http:/, 'https:')

5

Không phải là một cách Javascript để trả lời điều này nhưng nếu bạn sử dụng CloudFlare, bạn có thể viết các quy tắc trang chuyển hướng người dùng nhanh hơn nhiều sang HTTPS và nó hoàn toàn miễn phí. Trông như thế này trong Quy tắc trang của CloudFlare:

nhập mô tả hình ảnh ở đây


Tôi thực sự thấy điều này rất hữu ích, không phải để trả lời câu hỏi như đóng khung, mà là cung cấp thông tin hữu ích về một cách đáng tin cậy hơn cho dịch vụ SaaS không cung cấp SSL luôn luôn.
MrMesees

3

Bạn có thể làm:

  <script type="text/javascript">        
        if (window.location.protocol != "https:") {
           window.location.protocol = "https";
        }
    </script>

Nó hoạt động. Đó có phải là một cách tiêu chuẩn để chuyển hướng? nó sẽ hoạt động trong tất cả các trình duyệt?
mahfuz

1

Cách chức năng

window.location.protocol === 'http:' && (location.href = location.href.replace(/^http:/, 'https:'));


0

Tôi thích câu trả lời cho câu hỏi này. Nhưng để sáng tạo, tôi muốn chia sẻ thêm một cách:

<script>if (document.URL.substring(0,5) == "http:") {
            window.location.replace('https:' + document.URL.substring(5));
        }
</script>

-1
<script type="text/javascript">
        function showProtocall() {

            if (window.location.protocol != "https") {
                window.location = "https://" + window.location.href.substring(window.location.protocol.length, window.location.href.length);
                window.location.reload();
            }
        }
        showProtocall();
</script>

-1

Xin chào, tôi đã sử dụng giải pháp này hoạt động hoàn hảo. Không cần kiểm tra, chỉ cần sử dụng https.

<script language="javascript" type="text/javascript">
document.location="https:" + window.location.href.substring(window.location.protocol.length, window.location.href.length);
</script>

3
Điều này có làm mới trang ngay cả khi giao thức là https không?
Anthony

-2

Tôi vừa có tất cả các biến thể tập lệnh được Pui Cdm kiểm tra , bao gồm các câu trả lời ở trên và nhiều câu trả lời khác sử dụng php, htaccess, cấu hình máy chủ và Javascript, kết quả là tập lệnh

<script type="text/javascript">        
function showProtocall() {
        if (window.location.protocol != "https") {
            window.location = "https://" + window.location.href.substring(window.location.protocol.length, window.location.href.length);
            window.location.reload();
        }
    }
    showProtocall();
</script> 

được cung cấp bởi vivek-srivastava hoạt động tốt nhất và bạn có thể thêm bảo mật hơn nữa trong tập lệnh java.

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.