Làm thế nào để bạn chuyển hướng HTTPS sang HTTP?


166

Làm thế nào để bạn chuyển hướng HTTPS sang HTTP?. Đó là, trái ngược với những gì (dường như) mọi người dạy.

Tôi có một máy chủ trên HTTPS mà tôi đã trả chứng nhận SSL và một tấm gương mà tôi không có và giữ xung quanh chỉ cho các trường hợp khẩn cấp để không nhận được chứng nhận.

Trên máy tính để bàn của khách hàng, tôi có MỘT SỐ phím tắt trỏ đến http://production_serverhttps://production_server(cả hai đều hoạt động). Tuy nhiên, tôi biết rằng nếu máy chủ sản xuất của tôi gặp sự cố, thì chuyển tiếp DNS sẽ khởi động và những máy khách có "https" trên phím tắt của chúng sẽ nhìn chằm chằm vào https://mirror_server(không hoạt động) và màn hình lớn Internet Explorer 7 màu đỏ khó chịu cho công ty của tôi

Thật không may, tôi không thể chuyển đổi điều này ở cấp độ khách hàng. Những người dùng này rất mù chữ về máy tính: và rất có thể sẽ bối rối khi thấy các lỗi "không an toàn" của HTTPS (đặc biệt là cách Firefox 3 và Internet Explorer 7 xử lý hiện nay: FULL STOP, rất may, nhưng không giúp tôi ở đây LOL).

rất dễ dàng để tìm giải pháp Apache cho http-> https chuyển hướng , nhưng đối với cuộc sống của tôi, tôi không thể làm điều ngược lại.

Ý tưởng?


2
Đừng làm thế ! Chuyển hướng HTTPS từ HTTP cực kỳ nguy hiểm (và trên thực tế sẽ bị chặn bởi tất cả các trình duyệt do lạm dụng), đặc biệt nếu đây là nút thông qua trạng thái HTTP im lặng (nhưng điều này cũng đúng nếu điều này được thực hiện bởi javascript), trừ khi: - (1) có một trang đỗ xe HTTPS thoáng qua mời người dùng lướt qua một liên kết bằng cách nhấp vào nó một cách tích cực; hoặc: - (2) HTTPS chuyển hướng sang HTTP trên chính xác miền CÙNG VÀ các chuyển hướng không thay đổi loại nội dung được yêu cầu. Cho phép nó trong trình duyệt đã cho phép rất nhiều phần mềm độc hại vượt qua sự cô lập. Chuyển hướng như vậy là rất lừa dối.
verdy_p

4
Đây trông giống như một trang web nội bộ, nơi OP biết những gì đang xảy ra với nó và do đó không nguy hiểm ... Nếu đây là một máy chủ đối mặt với web, tôi đồng ý với bạn, nhưng một máy chủ web nội bộ, chỉ cục bộ, chuyển hướng trong thời trang này sẽ không thành vấn đề.
Stese

@verdy_p Tôi đang làm việc trên các chuyển hướng HTTPS sang HTTP 302, trường hợp cổng bị khóa. Bạn có thể chỉ cho tôi tài liệu mà bạn đang đề cập đến?
jprusakova

Đối với cổng bị khóa của bạn, không bao giờ thực hiện bất kỳ chuyển hướng HTTPS nào sang HTTP 302 trừ khi điều này chính xác đến cùng một tên miền (thậm chí không phải là tên miền phụ). Và vì có nguy cơ tiết lộ thông tin cao, hãy cẩn thận với mã thông báo phiên và cookie được chuyển qua một cách minh bạch với chuyển hướng! Bạn nên biết rằng các mục tiêu HTTP có thể được điều chỉnh và thông tin được lấy bởi các proxy trong suốt của phần mềm độc hại và thậm chí bởi DNS độc hại: người quản lý của bạn có thể thậm chí không biết rằng mục tiêu chỉ có HTTP sẽ không thể truy cập được và thực sự sẽ chuyển sang màu đen! Vì vậy, không bao giờ làm điều đó trên các liên kết HTTPS có chứa phiên / cookie / yêu cầu riêng tư.
verdy_p

Chuyển hướng HTTPS 302 như vậy luôn là lỗ hổng bảo mật trong trang web HTTPS của bạn. Rủi ro lớn là có các phiên bị đánh cắp và người dùng được xác thực của bạn có tài khoản riêng của họ bị thu hoạch. Và trong mọi trường hợp, KHÔNG BAO GIỜ thực hiện các chuyển hướng như vậy để tải javascripts hoặc đa phương tiện hoạt động: đây là một cánh cửa mở trong vương quốc "hộp cát" HTTPS. Thực sự xem xét làm điều gì đó ngược lại: chuyển hướng HTTP sang HTTPS (đáng chú ý là cổng chính của bạn hoặc các trang công cộng tĩnh không cần dữ liệu / phiên / cookie riêng tư) và sử dụng HTTPS cho mãi mãi. Nếu bạn cần chuyển từ HTTPS sang HTTP, hãy sử dụng các liên kết chuẩn (trong các yêu cầu riêng biệt)
verdy_p

Câu trả lời:


128

Điều này chưa được thử nghiệm nhưng tôi nghĩ nó nên hoạt động bằng mod_rewrite

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

1
Làm cách nào để tôi làm cho nó hoạt động (tôi phải thay đổi gì từ mã này sang tên miền của mình để làm cho mã này hoạt động)?
Bắt đầu

1
Enve: Chỉ cần thêm vào cấu hình vhost_ssl.conf của trang web của bạn (hoặc .htaccess ở thư mục gốc của trang web). Không có gì cần phải thay đổi, nó sẽ tự động sử dụng cùng tên máy chủ và đường dẫn url.
Darren Felton

1
Tôi nghĩ rằng bạn cũng có thể muốn bắt các chuỗi truy vấn. Tôi không chắc chắn, nhưng tôi nghĩ đoạn trích trên sẽ không chuyển tiếp chuỗi truy vấn từ https đến http.
Rustavore

12
Như được chỉ ra bởi Kieron bên dưới, điều này sẽ không hoạt động nếu máy chủ nhân bản không có chứng chỉ hợp lệ. Bạn vẫn sẽ thấy một cảnh báo lớn màu đỏ vì chứng chỉ không hợp lệ. Khi bạn bắt đầu sử dụng https, về cơ bản bạn sẽ bị mắc kẹt với nó. Hãy chuẩn bị để trả tiền cho nó trong suốt phần còn lại của cuộc đời bạn. Nếu bạn ngừng thanh toán, những người đã đánh dấu các liên kết https sẽ không thể truy cập được.
Stephen Cheng

2
Trả tiền cho phần còn lại của cuộc đời bạn? Bạn vẫn có thể sử dụng HTTPS nhưng thay đổi nhà cung cấp PKI của bạn và nhận chứng chỉ mới rẻ hơn. Bạn vẫn sẽ trả một vài đô la có, nhưng điều tương tự cũng đúng với tên miền và lưu trữ của bạn! Chứng chỉ PKI bây giờ KHÔNG đắt so với tên miền và không đáng kể so với chi phí lưu trữ / băng thông!
verdy_p

71

Hãy nhớ rằng công cụ Rewrite chỉ khởi động khi nhận được yêu cầu HTTP - điều đó có nghĩa là bạn vẫn sẽ cần chứng chỉ, để khách hàng thiết lập kết nối để gửi yêu cầu!

Tuy nhiên, nếu máy dự phòng sẽ xuất hiện có cùng tên máy chủ (liên quan đến máy khách), thì không có lý do gì bạn không thể sử dụng cùng một chứng chỉ như máy sản xuất chính.


1
Làm thế nào để hạn chế này có thể được khắc phục? Tôi gặp vấn đề tương tự. nhận được lỗi certifcate từ trình duyệt trước khi chuyển hướng.
Sandeep Balagopal

Sẽ thật tuyệt khi có một chuyển hướng trở lại HTTP nếu có lỗi chứng chỉ
Jeffrey the Gi hươu cao cổ

Điều đó hoàn toàn đánh bại mục đích có HTTPS ngay từ đầu
FluffyBying 26/03/19

12

Dựa trên câu trả lời của ejunker, đây là giải pháp hoạt động với tôi, không phải trên một máy chủ duy nhất mà trên môi trường đám mây

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{ENV:HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Sử dụng 301 có thể ít nguy hiểm. 301 có nghĩa là bị xóa vĩnh viễn và tôi đoán việc chuyển từ https sang http là tạm thời. Xem câu trả lời được chấp nhận này để biết những nhược điểm của người dùng stackoverflow.com/questions/1393280/
Khăn

Sự phân biệt vĩnh viễn / tạm thời 301/302 chỉ liên quan đến các công cụ tìm kiếm.
matthewv789

9

Đối với những người đang sử dụng một .conftập tin.

<VirtualHost *:443>
    ServerName domain.com
    RewriteEngine On
    RewriteCond %{HTTPS} on
    RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/domain.crt
    SSLCertificateKeyFile /etc/apache2/ssl/domain.key
    SSLCACertificateFile /etc/apache2/ssl/domain.crt

</VirtualHost>

8

Nếu không có giải pháp nào ở trên phù hợp với bạn (chúng không dành cho tôi) thì đây là giải pháp hoạt động trên máy chủ của tôi:

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]

6
Thông thường, bạn sẽ không muốn L,(có nghĩa là "Quy tắc cuối cùng"). Nếu bạn đang sử dụng wordpress hoặc CMS khác, Lcờ có thể ngăn yêu cầu trang được định tuyến chính xác. Thay vào đó hãy sử dụng:RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301]
Rustavore

5

tất cả những điều trên không hoạt động khi tôi sử dụng cloudflare, cái này hoạt động với tôi:

RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

và cái này chắc chắn hoạt động mà không có proxy theo cách:

RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

3

Tốt hơn là tránh sử dụng mod_rewrite khi bạn có thể.

Trong trường hợp của bạn, tôi sẽ thay thế Rewrite bằng điều này:

    <If "%{HTTPS} == 'on'" >
            Redirect permanent / http://production_server/
    </If>

Lệnh <If>này chỉ có sẵn trong Apache 2.4+ theo blog này tại đây .


Trong một môi trường được lưu trữ, người ta có thể kiểm tra phiên bản của Apache bằng cách sử dụng/usr/sbin/httpd -v
Serge Stroobandt

1

cái này hiệu quả với tôi

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
    Redirect "https://www.example.com/" "http://www.example.com/"
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    # ... 
</VirtualHost>

hãy chắc chắn nghe cả hai cổng 80 và 443.


0

Không có câu trả lời nào phù hợp với tôi trên trang web Wordpress nhưng sau đó hoạt động (nó tương tự như các câu trả lời khác nhưng có một chút thay đổi)

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Không sử dụng các quy tắc đó một cách mù quáng với tất cả REQUEST_URI (không nên sử dụng quy tắc này nếu có bất kỳ dữ liệu biểu mẫu nào trong URI hoặc ID / phiên ID trong siêu dữ liệu yêu cầu). Chỉ sử dụng nó cho các trang / hình ảnh công cộng tĩnh. Tránh hoàn toàn cho javascripts hoặc các thành phần hoạt động (đáng chú ý là các luồng video có thể viết script hoặc PDF hoạt động trừ khi chúng được bạn ký bằng kỹ thuật số! Bạn vẫn không thể ký kỹ thuật số javascripts, chỉ giữ chúng trên miền an toàn của bạn).
verdy_p

Lưu ý: một số định dạng hình ảnh đang hoạt động và có thể viết script: hãy cẩn thận với SVG chẳng hạn. Chúng tôi đã thấy các cuộc tấn công vào một số trang web HTTPS tải hình ảnh SVG từ HTTP (với chuyển hướng 302 của trang web) và được thu thập bằng phần mềm độc hại chèn tập lệnh trong nội dung SVG ... Các trình duyệt lý tưởng nên cách ly các nhà thầu phụ HTTP khỏi HTTPS và đặt nó vào hộp cát (vì vậy CORS hạn chế bảo mật cũng được áp dụng, ngay cả khi nó có cùng tên miền ...) vì vậy "http: // (tên miền) / ..." và "https: // (tên miền) /" phải được coi là tên miền riêng biệt cho CORS (không cùng nguồn gốc) ngay cả khi chúng ở trên cùng một số cổng TCP.
verdy_p

@verdy_p, chính xác ý của bạn là gì với "chuyển hướng 302 của trang web"? Bạn phải sở hữu trang web máy chủ trước (hoặc các nút người tham gia ở cấp TCP / IP, như máy chủ DNS, bộ định tuyến), để khai thác các yêu cầu tài nguyên HTTP đó, phải không?
Sz.

Không cần thiết. HTTPS trên một tên miền sẽ an toàn trong khi HTTP trên cùng một tên miền sẽ không (khai thác không yêu cầu kiểm soát IP hoặc bộ định tuyến hoặc máy chủ DNS ngay cả khi sử dụng DNSSEC; phiên an toàn). Vì vậy, tôi duy trì rằng một trang web HTTPS phải lưu trữ hình ảnh (ngay cả trên cùng một tên miền) bằng cách không phân phát chúng bằng HTTP (thậm chí nó bị từ chối theo mặc định trong một số trình duyệt yêu cầu nhấp vào kích hoạt hoặc che dấu những hình ảnh không an toàn đó). Phải cấm HTTPS / HTTP hỗn hợp: trang web có thể bị tấn công trên các phần HTTP của nó (ví dụ: pixel theo dõi).
verdy_p

-6

Theo như tôi biết về một meta refresh đơn giản cũng hoạt động mà không gây ra lỗi:

<meta http-equiv="refresh" content="0;URL='http://www.yourdomain.com/path'">

12
Tôi muốn cử tri sẽ được yêu cầu để lại ý kiến ​​giải thích lý do cho số phiếu giảm. Cá nhân, tôi sẽ không chọn câu trả lời này trừ khi bạn là nhà phát triển không có quyền truy cập vào máy chủ mà bạn đang phát triển nhưng bạn đã có quyền truy cập vào trang. Một vấn đề là bạn sẽ phải mã hóa mọi đường dẫn trên mỗi trang để làm việc này. Nếu bạn có thể cho rằng JavaScript được bật cho các trường hợp sử dụng quan trọng của mình, bạn nên sử dụng JavaScript để thay đổi thành http. Các câu trả lời trên tốt hơn vì chúng không yêu cầu javascript vì chúng xảy ra tại máy chủ.
Rustavore

2
Đơn giản: vì htaccess là lựa chọn tốt hơn thế nhiều. Ngoài ra, nó không 'sẽ khắc phục sự cố để chuyển hướng giao thức https sang http nếu bạn không có chứng chỉ.
midudev

1
Hành động nên được xử lý bởi máy chủ, chứ không phải tài liệu 'a' mà nó có thể phục vụ.
mất
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.