Tôi đã có thể thiết lập một liên kết từ trang HTTPS đến trang HTTP trên một tên miền khác và vẫn chuyển URL của trang đầu tiên dưới dạng tham chiếu bằng kỹ thuật sau.
Các định nghĩa
Trang gốc : Trang HTTPS nơi đặt liên kết đến trang đích được lưu trữ HTTP. Trong ví dụ này:https://example1.com/origin.html
Trang đích : Trang HTTP có quyền truy cập vào tham chiếu của trang gốc. Trong ví dụ này:http://example2.com/destination.html
Kế hoạch cơ bản
Điều này có tác dụng làm cho chuyển hướng đến từ phiên bản HTTP của trang gốc:
Liên kết trên trang gốc HTTPS liên kết đến trang hiện tại nhưng thêm một tham số truy vấn cho trang đích [1]. ví dụ:https://example1.com/origin.html?goto=http://example2.com/destination.html
Khi nhấp vào liên kết, máy chủ tại example1.com sẽ ngắt yêu cầu tiêu chuẩn khi có tham số truy vấn 'goto'. Sau đó nó:
- Lưu trữ tham số 'goto' trong cookie 'goto'.
- Xóa tham số và giá trị 'goto' khỏi url của yêu cầu hiện tại
- 302 chuyển hướng đến url được làm sạch mới này trên phiên bản HTTP của miền gốc tức là.
http://example1.com/origin.html
Máy chủ kiểm tra mọi yêu cầu đối với cookie 'goto' và nếu có sẽ xóa cookie và sau đó hiển thị trang chuyển hướng rất đơn giản. Trang này chứa [2]:
- Tập lệnh Javascript window.location.replace () chuyển hướng đến url cookie goto.
- Thẻ Meta Refresh có giá trị của url goto cookie và độ trễ vài giây.
- Một liên kết đến url cookie goto.
Ghi chú
[1] Giải pháp cơ bản này là một chuyển hướng mở và cần cân nhắc một chút để bảo vệ chống lại kẻ xấu bằng cách sử dụng tham số truy vấn goto để chuyển hướng UAs trong các cuộc tấn công lừa đảo.
[2] Không phải tất cả các trình duyệt sẽ gửi người giới thiệu khi chuyển hướng qua thẻ chuyển hướng JS hoặc thẻ làm mới meta. Trong thử nghiệm của tôi IE8 trở xuống không vượt qua người giới thiệu.
Tôi không chắc liệu kỹ thuật này có cho phép các trình thu thập thông tin của công cụ tìm kiếm theo các liên kết hay không. Điều này không quan trọng đối với yêu cầu của tôi.
Nếu UA có cookie bị vô hiệu hóa thì điều này sẽ chỉ chuyển hướng đến trang gốc.
Cho phép kết nối HTTP chỉ để chuyển hướng
Trên máy chủ của tôi, tôi có một quy tắc Apache để thực thi HTTPS bất kể yêu cầu:
<VirtualHost *:80>
ServerName example1.com
# if not on port 443 then 301 redirect to https while keeping any query string
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example1\.com$ [NC]
RewriteCond %{SERVER_PORT} !443
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [L,QSA,R=301]
Để kỹ thuật chuyển hướng ở trên hoạt động, tôi cần một số cách để cho phép kết nối HTTP một cách có điều kiện. Có rất nhiều cách để làm điều này. Tôi quyết định một cookie sẽ hoạt động.
<VirtualHost *:80>
ServerName example1.com
# if not on port 443 then 301 redirect to https while keeping any query string
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example1\.com$ [NC]
RewriteCond %{SERVER_PORT} !443
RewriteCond %{HTTP_COOKIE} !disable_ssl [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [L,QSA,R=301]
Cookie vô hiệu hóa sẽ được đặt ở bước 2 và sau đó bị xóa ở bước 3.
Origin
nên còn nguyên vẹn, có thể không phù hợp với trường hợp sử dụng của bạn mặc dù.