2008-08-12 80 views
136

Làm cách nào để chuyển hướng HTTPS sang HTTP ?. Đó là, đối diện với những gì (dường như) mọi người đều dạy.Làm cách nào để chuyển hướng HTTPS sang HTTP?

Tôi có một máy chủ trên HTTPS mà tôi đã thanh toán chứng nhận SSL và máy nhân bản mà tôi không có và giữ lại chỉ trong trường hợp khẩn cấp để nó không đáng đượ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 cơ quan). Tuy nhiên, tôi biết rằng nếu máy chủ sản xuất của tôi bị hỏng, thì việc chuyển tiếp DNS sẽ xuất hiện và những khách hàng có "https" trên phím tắt của họ sẽ nhìn chằm chằm vào https://mirror_server (không hoạt động) và màn hình màu đỏ khổng lồ của Internet Explorer 7 không thoải mái cho công ty của tôi.

Thật không may, tôi không thể chỉ 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ó khả năng không nhìn thấy lỗi "không an toàn" của HTTPS (đặc biệt là cách Firefox 3 và Internet Explorer 7 xử lý nó ngày nay: FULL STOP, loại may mắn, nhưng không giúp tôi ở đây LOL).

Đó là very easyto findApache solutions cho http->https redirection, nhưng đối với cuộc sống của tôi, tôi không thể làm ngược lại.

Ý tưởng?

Trả lời

114

này chưa được thử nghiệm nhưng tôi nghĩ rằng điều này sẽ làm việc sử dụng mod_rewrite

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

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

+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 tại thư mục gốc của trang web). Không có gì cần phải được thay đổi nó sẽ tự động sử dụng cùng một tên máy chủ và đường dẫn url. – Meogi

+1

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

64

Hãy ghi nhớ rằng động cơ Rewrite chỉ đá trong một lần yêu cầu HTTP đã được nhận được - có nghĩa là bạn vẫn sẽ cần một giấy chứng nhận , để cho khách hàng thiết lập kết nối để gửi yêu cầu qua!

Tuy nhiên, nếu máy sao lưu có vẻ như có cùng tên máy (theo như khách hàng quan tâm), thì không có lý do gì bạn không thể sử dụng cùng chứng chỉ làm máy sản xuất chính.

+0

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

-7

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

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

Tôi muốn các cử tri sẽ được yêu cầu để lại ý kiến ​​giải thích lý do bỏ phiếu xuống. 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ể giả sử rằng JavaScript được bật cho các trường hợp sử dụng quan trọng của bạn, bạn nên sử dụng JavaScript để thay đổi thành http. Các câu trả lời trên là tốt hơn bởi vì họ không yêu cầu javascript vì chúng xảy ra ở máy chủ. – Rustavore

+2

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

+1

Hành động sẽ được xử lý bởi máy chủ chứ không phải tài liệu 'a' mà nó có thể phân phát. – albal

11

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

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

Nếu không ai trong số các giải pháp trên làm việc cho bạn (họ không cho tôi) đây là những gì làm việc 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, cờ 'L' có thể ngăn yêu cầu trang được định tuyến đúng cách. Thay vào đó sử dụng: 'RewriteRule^(. *) $ Http: //% {HTTP_HOST}/$ 1 [R = 301]' – Rustavore

6

Đối với những người đang sử dụng tệp .conf.

<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> 
1

Tốt hơn nên 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 với điều này:

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

Chỉ thị <If> chỉ có sẵn trong Apache 2.4+ theo này blog here

3

tất cả ở trên không hoạt động khi tôi sử dụng CloudFlare, chương trình này làm việc cho tôi:

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

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

RewriteCond %{HTTPS} on 
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 
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 các công trình sau (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] 
Các vấn đề liên quan