2013-08-20 28 views
7

tôi có quy tắc sau đây trên tập tin .htaccess tôiRedirect Vòng trong khi chuyển hướng tất cả các yêu cầu http đến https sử dụng .htaccess

# to redirect http to https 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://www.example.com/$1 [R=301,L] 

# to redirect urls with index.php to/
RewriteCond %{THE_REQUEST} ^.*/index.php 
RewriteRule ^(.*)index.php$ /$1 [R=301,L] 

# to redirect non www requests to www url 
RewriteCond %{HTTP_HOST} !^www\.example\.com 
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L] 

Khi tôi đang cố gắng để truy cập vào trang web, nó biến thành một vòng Redirect. Cách khắc phục sự cố này và chuyển hướng đúng cách?

+0

URL nào gây ra vòng lặp chuyển hướng? –

+0

@JonLin Tất cả URL – Debiprasad

+0

Tất cả đều hoạt động tốt cho tôi trong tệp htaccess trống. Bạn có chắc chắn chuyển hướng https của bạn không thiếu 'www'? –

Trả lời

25

Chỉ trong trường hợp ai đó có vòng lặp chuyển hướng khi sử dụng Apache http-> https viết lại sau bộ cân bằng tải, đây là giải pháp phù hợp với tôi.

Tôi đã gặp vấn đề tương tự khi sử dụng RewriteCond% {HTTPS} tắt cho Apache phía sau trình cân bằng tải, khi trình cân bằng tải thực hiện công cụ SSL.

Nếu phiên bản https của trang web không được định cấu hình qua Apache ModSSL, nó không đặt biến% {HTTPS} thành "bật" và tiếp tục chuyển hướng vô hạn. Giải pháp đơn giản nhất để khắc phục nó là nhắm mục tiêu tất cả lưu lượng truy cập https đến một Apache VirtualHost khác (khi SSL được xử lý bởi bộ cân bằng tải) là bản sao chính, nhưng có cổng khác (cho phép nói 81). Quay lại đầu trang Và trong .htaccess làm mod_rewrite cho tất cả mọi thứ mà không phải là trên cổng 81:

ReWriteCond %{SERVER_PORT} !^81$ 
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L] 

Cách thứ hai để làm điều này là để gửi cho X-Forwarded-Proto đánh đầu từ cân bằng tải để Apache và sử dụng nó trong tình trạng viết lại:

RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L] 
+2

Yay, bạn nói đúng! Tôi đã từng gặp vấn đề tương tự. Tuy nhiên, tôi không thể làm cho mã của bạn hoạt động, tôi đã sử dụng mã này thay thế: 'RewriteEngine On RewriteCond% {SERVER_PORT} 80 RewriteRule^(. *) $ Https://domain.com/$1 [R, L]' – Gabin

+2

Cảm ơn Konstantin, đang tìm kiếm ở khắp mọi nơi. HTTP: X-Forwarded-Proto đã giải quyết nó. – JohnWolf

+0

Làm việc cho tôi. Tuyệt cám ơn bạn rất nhiều. – Deus777

7

Tôi đã nhìn thấy rất nhiều người gặp phải các vòng chuyển hướng khi cố sử dụng các tệp .htaccess để di chuyển từ http đến https. Và có rất nhiều câu trả lời khác nhau để giải quyết vấn đề này. Một số người nói:

ReWriteCond %{SERVER_PORT} 80 
OR 
RewriteCond %{HTTPS} off 
OR 
RewriteCond %{HTTPS} !on 
OR (as above) 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
OR EVEN 
RewriteCond %{HTTP:X-Forwarded-SSL} =off 

nhưng không có cách nào trong số này phù hợp với tôi. Cuối cùng tôi đã khám phá ra sự thật cơ bản, rằng các máy chủ khác nhau được cấu hình theo nhiều cách khác nhau và tất cả chúng đều cung cấp các biến máy chủ khác nhau.

Nếu không có cách nào ở trên phù hợp với bạn, thì mẹo là sử dụng PHP để tìm ra biến env mà máy chủ cụ thể gửi cho bạn khi bạn truy cập trang http và biến env nào sẽ gửi cho bạn khi bạn truy cập trang https và sau đó bạn có thể sử dụng biến đó để thực hiện chuyển hướng. Chỉ cần tạo một tệp PHP (chẳng hạn như showphpvars.php) trên máy chủ của bạn với mã này:

<?php phpinfo() ?> 

và sau đó xem bằng trình duyệt. Tìm phần của biến với _SERVER ["HTTP_HOST" (vv)] trong đó, và có một trinh sát xung quanh cho một thay đổi cho http so với https. Tôi hóa ra là một biến được gọi là SSL được đặt thành 1 khi sử dụng https và không được đặt ở tất cả khi sử dụng http.

Tôi đã sử dụng biến đó để chuyển hướng đến https bằng PHP, rất thú vị hơn sử dụng htaccess, nhưng tôi nghĩ rằng bất kỳ biến _SERVER nào cũng có thể được truy cập bằng htaccess, nếu bạn muốn tiếp tục sử dụng . Chỉ cần sử dụng tên bên trong dấu ngoặc kép, không có bit _SERVER [""] mà PHP thêm vào.

+0

[@ z-m] (http://stackoverflow.com/users/4671199/z-m), câu trả lời thực sự hữu ích đã đưa tôi đến giải pháp cá nhân của tôi. Tôi chỉ có thể khuyên bạn nên có một cái nhìn tại đầu ra 'phpinfo()'. Nó có thể giúp bạn tiết kiệm hàng giờ rắc rối. Thanh danh! – twigmac

1

Nếu bạn nhận được vòng lặp chuyển hướng bất kể bạn làm gì trong htaccess, hãy thực hiện chuyển hướng trong PHP thay thế.

Tôi đã sử dụng phpinfo(), như @ z-m đề xuất, để tìm biến thay đổi khi tôi đang sử dụng SSL. Trong trường hợp của tôi là $ _SERVER ['HTTP_X_PROTO'] == "https". Khi không sử dụng SSL, biến này chưa được đặt.

Đây là mã tôi sử dụng để chuyển hướng từ HTTP thành HTTPS:

if ($_SERVER['HTTP_X_PROTO'] != "https") { 
    header("HTTP/1.1 301 Moved Permanently"); 
    $location = "https://" . $_SERVER[HTTP_HOST] . $_SERVER[REQUEST_URI]; 
    header("Location: $location"); 
    exit; 
    } 
+0

Cảm ơn bạn rất nhiều vì mã, trợ giúp lớn! – daviddhont

1
RewriteEngine on 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{ 
+1

Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung liên quan đến _why_ và/hoặc _how_ nó trả lời câu hỏi sẽ cải thiện đáng kể giá trị dài hạn của nó. Xin vui lòng [sửa] câu trả lời của bạn để thêm một số lời giải thích. –

+0

Điều này làm việc cho tôi – dexterslab

1

Trong trường hợp của tôi đó là:

if ($_SERVER['HTTPS'] != "on") 
0

Để biết thông tin của bạn, nó thực sự phụ thuộc vào nhà cung cấp dịch vụ lưu trữ của bạn. Nó có thể sử dụng Load Balancer, như đã nói bởi Konstantin trong một câu trả lời khác.

Trong trường hợp của tôi (Infomaniak), không có gì ở trên thực sự hoạt động và tôi có vòng lặp chuyển hướng vô hạn.

Cách đúng để làm điều này là actually explained in their support site:

RewriteEngine on 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule (.*) https://your-domain.com/$1 [R=301,L] 

Vì vậy, luôn luôn kiểm tra với nhà cung cấp hosting của bạn. Hy vọng rằng họ có một bài viết giải thích làm thế nào để làm điều này. Nếu không, chỉ cần yêu cầu hỗ trợ.