Cách chuyển hướng tất cả các yêu cầu HTTP sang HTTPS


294

Tôi đang cố gắng chuyển hướng tất cả các yêu cầu HTTP không an toàn trên trang web của mình (ví dụ http://www.example.com) sang HTTPS ( https://www.example.com). Tôi đang sử dụng btw PHP. Tôi có thể làm điều này trong .htaccess không?


1
Bạn có thể (và nên) làm điều này thông qua của bạn httpd, không phải với PHP.
vét

2
@jnpcl, trong khi tôi đồng ý giải pháp httpd tốt hơn là giải pháp dựa trên PHP, tôi không nghĩ rằng việc chuyển hướng có hệ thống là một cách thực hành tốt nói chung. Nếu bạn muốn chuyển hướng người dùng của mình đến HTTPS mọi lúc, hãy gửi họ đến đó từ "điểm vào" (liên kết đầu tiên đến trang web của bạn), đừng thực hiện nửa chừng, điều này có thể làm rò rỉ một số dữ liệu mà bạn nghĩ được bảo vệ (nếu bạn không nhận thấy rằng chuyển hướng tức thời).
Bruno

@Bruno: Tôi đã suy nghĩ nhiều dọc theo dòng của yêu cầu trùng lặp http, tiềm năng cho các chuỗi truy vấn bị mất, và khả năng của người sử dụng nhập thủ cônghttp://
Drudge

@jnpcl đó thực sự là một điểm tốt. Tôi chỉ đơn thuần đề xuất rằng, trong khi mọi người có xu hướng yêu cầu loại chuyển hướng này để cải thiện tính bảo mật của trang web của họ, thì thực tế, nó không thực sự cải thiện nó (vì nó không ngăn chặn cùng một yêu cầu thông qua HTTP đơn giản trước) .
Bruno

8
@outis: liên kết đầu tiên bạn đăng là câu hỏi này .
Mei

Câu trả lời:


305

Cập nhật: Mặc dù câu trả lời này đã được chấp nhận vài năm trước, lưu ý rằng cách tiếp cận của nó hiện được khuyến nghị đối với tài liệu Apache. Sử dụng Redirectthay thế. Xem câu trả lời này .


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

24
@Cat, như tôi đã nói trong câu trả lời / nhận xét của mình, nếu bạn đang cố gắng "chuyển hướng tất cả HTTP không an toàn [...] sang HTTPS", cách tiếp cận này sẽ không đảm bảo các yêu cầu đó, nó sẽ khiến trình duyệt thực hiện chúng hai lần, một lần không an toàn và một lần an toàn.
Bruno

13
Những gì bạn thực sự nên làm là sử dụng HSTS trong buổi hòa nhạc với điều này.
Reese Moore

3
Đây có thể là một lỗi trong phiên bản apache của tôi (2.4.6 như được đóng gói trong Centos 7), nhưng điều này có vấn đề với tôi trên một số URL nhất định. Ví dụ: http://server/foo?email=someone%40example.comchuyển hướng đến https://server/foo?email=someone%2540example.comtức là dấu "@" được trích dẫn URL hai lần . Sử dụng phương thức trong câu trả lời của @ ssc không có vấn đề này.
psmears 30/03/2015

2
Câu trả lời sai. Nó sẽ chỉ chuyển hướng url cơ sở, không phải url trong các thư mục con. RewriteRule (. *) Https: //% {HTTP_HOST}% {REQUEST_URI} [R = 301, L] là câu trả lời đúng
FredTheWebGuy

7
Họ không nhất thiết phải đề nghị chống lại nó:In the case of the http-to-https redirection, the use of RewriteRule would be appropriate if you don't have access to the main server configuration file, and are obliged to perform this task in a .htaccess file instead.
Adam

338

Các tài liệu Apache khuyên không nên sử dụng viết lại:

Để chuyển hướng httpURL đến https, hãy làm như sau:

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

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

Đoạn mã này sẽ đi vào tệp cấu hình máy chủ chính, không phải vào .htaccesscâu hỏi trong câu hỏi.

Bài viết này có thể đã được đưa ra chỉ sau khi câu hỏi được hỏi và trả lời, nhưng dường như là cách hiện tại để đi.


11
Đây phải là câu trả lời hiện tại. Nhưng chính xác những gì diễn ra trong "cấu hình SSL"? Một ví dụ đầy đủ sẽ thực sự hữu ích.
Bến

6
@Ben: đó là một câu hỏi khác nhau được ghi lại rộng rãi trên mạng; tình cờ, tôi vừa thêm một ví dụ gần như đầy đủ vào ngày hôm qua: serverfault.com/q/597012/26210 có thể cho bạn ý tưởng về những gì diễn ra trong cấu hình SSL
ssc

46
Đây là một gợi ý tuyệt vời. Nhưng tại tài liệu Apache cũng đề cập: "Trong trường hợp chuyển hướng http-to-https, việc sử dụng RewriteRule sẽ phù hợp nếu bạn không có quyền truy cập vào tệp cấu hình máy chủ chính và bắt buộc phải thực hiện tác vụ này trong thay vào đó, một tập tin .htaccess. " Đó là trường hợp của tôi ...
peter_the_oak

4
@ user1844933 Nếu bạn sử dụng permanent từ khóa, hiệu ứng là như nhau (trình duyệt nhận được chuyển hướng 301). Ví dụ:Redirect permanent "/" "https://example.com"
BeetleJuice

2
@Whitecat Trong Centos 6, tập tin được đặt tại /etc/httpd/conf/httpd.conf
dstonek

141

Tôi muốn giới thiệu với chuyển hướng 301:

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

7
cảm ơn, điều này hiệu quả với tôi, câu trả lời được chấp nhận không .. có lẽ là do thiếu[L]
billynoah

1
Vâng. Đây là câu trả lời đúng vì nó cũng định tuyến tất cả các url trong các thư mục con
FredTheWebGuy

Đây có phải là ở cấp cao nhất của tập tin htaccess?
CodyBugstein

1
@CodyBugstein Đó là nơi tôi luôn đặt nó và nó luôn hoạt động.
Daan van den Bergh

3
Tất cả các câu trả lời đều thiếu một điều - bất kỳ mã nào để chuyển hướng phải được đặt ngay ở đầu tệp .htaccess của bạn, TRƯỚC bất cứ điều gì khác, nếu bạn muốn tất cả các trang được chuyển hướng đến https.
Vadim Anisimov

35

Như tôi đã nói trong câu hỏi này , tôi khuyên bạn nên tránh chuyển hướng tất cả các yêu cầu HTTP sang HTTPS của họ một cách mù quáng, vì nó có thể gây cho bạn ấn tượng sai về bảo mật. Thay vào đó, có lẽ bạn nên chuyển hướng "root" của trang web HTTP của bạn đến thư mục gốc của trang web HTTPS và liên kết từ đó, chỉ đến HTTPS.

Vấn đề là nếu một số liên kết hoặc biểu mẫu trên trang web HTTPS khiến khách hàng gửi yêu cầu đến trang HTTP, nội dung của nó sẽ hiển thị trước khi chuyển hướng.

Ví dụ: nếu một trong các trang của bạn được phân phát qua HTTPS có biểu mẫu cho biết <form action="http://example.com/doSomething"> và gửi một số dữ liệu không nên gửi rõ ràng, trước tiên trình duyệt sẽ gửi yêu cầu đầy đủ (bao gồm cả thực thể, nếu đó là POST) đến trang web HTTP Đầu tiên. Chuyển hướng sẽ được gửi ngay lập tức đến trình duyệt và do một số lượng lớn người dùng vô hiệu hóa hoặc bỏ qua các cảnh báo, nên có khả năng bị bỏ qua.

Tất nhiên, lỗi cung cấp các liên kết nên đến trang web HTTPS nhưng cuối cùng lại xảy ra với trang HTTP có thể gây ra sự cố ngay khi bạn nhận được một cái gì đó nghe trên cổng HTTP trên cùng địa chỉ IP như trang web HTTPS của bạn. Tuy nhiên, tôi nghĩ việc giữ hai trang web như một "tấm gương" chỉ làm tăng khả năng mắc lỗi, vì bạn có thể có xu hướng đưa ra giả định rằng nó sẽ tự động sửa lỗi bằng cách chuyển hướng người dùng sang HTTPS, trong khi đó thường là quá muộn. (Có những cuộc thảo luận tương tự trong câu hỏi này. )


1
Khi đưa ra quyết định phục vụ toàn bộ trang web dưới dạng HTTPS, loại chuyển hướng này có ý nghĩa. Tôi không muốn người dùng nhận được 403 vì họ đã chỉ định http cho trang đích của họ. Tôi đồng ý nếu ai đó KHÔNG chỉ định http trong một liên kết và triển khai nó để sản xuất là xấu. Nó NÊN bị bắt trong khi thử nghiệm, ngay cả khi chuyển hướng tại chỗ. Tôi không thích tranh luận "có thể" bởi vì điều này "có thể" xảy ra mà không có sự chuyển hướng tại chỗ. Các triệu chứng giống nhau khi kiểm tra trong một trình duyệt an toàn, ngoại trừ sau khi xác nhận gửi đi rõ ràng, nó chuyển hướng thay vì nhận 403.
Derek Litz

Vâng, tôi thấy lợi ích của việc thất bại nặng nề nếu ai đó đặt nhầm http vào một hành động biểu mẫu, nhưng việc khoan dung với các URL được nhập có vẻ quan trọng hơn trong hầu hết các trường hợp.
Daniel Lubarov

4
@Daniel, tôi đồng ý rằng thật hữu ích khi được khoan hồng khi người dùng nhập URL. Tôi muốn nói rằng đó là một trong những trường hợp tốt hơn để tắt tính năng này trong quá trình phát triển / thử nghiệm nhưng bật nó lên sản xuất (hoặc trong giai đoạn phát triển / thử nghiệm cuối cùng).
Bruno

tại sao không làm http đến https tại dns.
Muhammad Umer

1
@MuhammadUmer, vì điều này không liên quan gì đến DNS. Nói chung, họ sẽ sử dụng cùng một tên máy chủ, nhưng ngay cả với một tên máy chủ khác, bạn vẫn cần thay đổi giao thức và cổng.
Bruno

18

Tôi phát hiện ra rằng cách tốt nhất cho https và www trên tên miền là

RewriteCond %{HTTPS} off 
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]

Điều này sẽ không chuyển hướng http://www.example.com/...bởi vì hai điều kiện hoàn toàn là AND'd. Thay vào đó, chúng phải là OR'd. bao gồm ORcờ ở điều kiện đầu tiên (và nhớ thoát khỏi các chấm theo nghĩa đen trong biểu thức chính quy). Nhưng nếu bạn đang triển khai HSTS thì bạn không muốn chuyển hướng đến HTTPS và www trong một chuyển hướng duy nhất, trước tiên bạn nên chuyển hướng đến HTTPS .
MrWhite

Tôi để văn bản này ở đâu?
Aaron Franke

Về loại câu hỏi tương tự. Bất cứ ai có thể giúp đỡ với câu hỏi dưới đây? stackoverflow.com/questions/59503217/
Mạnh

14

Đây là cách tiếp cận chuyển hướng html mà nó hoạt động nhưng không phải là tốt nhất.

 <meta http-equiv="Refresh" content="0;URL=https://www.example.com" />

Cách tiếp cận PHP

<?php
function redirectTohttps() {
    if ($_SERVER['HTTPS']!="on") {
        $redirect= "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        header("Location:$redirect"); 
    } 
}
?>

.htaccess phê duyệt

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

sao chép từ: www.letuslook.org


Nơi nào .htaccessđi? Ngoài ra, liên kết đó là chết.
Aaron Franke

8

Tôi thích phương pháp chuyển hướng này từ http sang https. Bởi vì tôi không cần chỉnh sửa nó cho từng trang web.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

Tôi để văn bản này ở đâu?
Aaron Franke

6

Sử dụng mã sau trong tệp .htaccess của bạn sẽ tự động chuyển hướng khách truy cập đến phiên bản HTTPS của trang web của bạn:

RewriteEngine On

RewriteCond %{HTTPS} off

RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Nếu bạn có tệp .htaccess hiện có:

Không trùng lặp RewriteEngine On.

Đảm bảo rằng các dòng bắt đầu RewriteCond và RewriteRule ngay lập tức tuân theo RewriteEngine On đã tồn tại.


L và R có nghĩa là gì?
Aaron Franke

5

Đây là phương pháp thích hợp để chuyển hướng HTTP sang HTTPS bằng cách sử dụng .htaccess theo GoDaddy.com. Dòng mã đầu tiên là tự giải thích. Dòng mã thứ hai kiểm tra xem HTTPS có bị tắt hay không và nếu vậy nó sẽ chuyển hướng HTTP sang HTTPS bằng cách chạy dòng mã thứ ba, nếu không thì dòng mã thứ ba sẽ bị bỏ qua.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

https://www.godaddy.com/help/redirect-http-to-https-automatically-8828


5

Giải pháp tốt nhất phụ thuộc vào yêu cầu của bạn. Đây là một bản tóm tắt các câu trả lời được đăng trước đó với một số bối cảnh được thêm vào.

Nếu bạn làm việc với máy chủ web Apache và có thể thay đổi cấu hình của nó, hãy làm theo tài liệu Apache :

<VirtualHost *:80>
    ServerName www.example.com
    Redirect "/" "https://www.example.com/"
</VirtualHost>

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

Nhưng bạn cũng hỏi nếu bạn có thể làm điều đó trong một .htaccesstập tin. Trong trường hợp đó, bạn có thể sử dụng RewriteEngine của Apache :

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]

Nếu mọi thứ đều hoạt động tốt và bạn muốn trình duyệt ghi nhớ chuyển hướng này, bạn có thể khai báo nó là vĩnh viễn bằng cách thay đổi dòng cuối cùng thành:

RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Nhưng hãy cẩn thận nếu bạn có thể thay đổi suy nghĩ về chuyển hướng này. Các trình duyệt nhớ nó trong một thời gian rất dài và sẽ không kiểm tra nếu nó thay đổi.

Bạn có thể không cần dòng đầu tiên RewriteEngine On tùy thuộc vào cấu hình máy chủ web.

Nếu bạn tìm kiếm một giải pháp PHP, hãy xem mảng $ _SERVERhàm tiêu đề :

if (!$_SERVER['HTTPS']) {
    header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); 
} 

Có vẻ như tài liệu Apache đề xuất chống lại tuyến đường Rewrite. Còn với Redirect thì sao? Những gì khác có thể đi trong một .htaccesstập tin?
Aaron Franke

Có, Redirect được ưa thích và có thể được sử dụng trong .htaccess. Nhưng bạn không thể thêm điều kiện để chỉ chuyển hướng lưu lượng truy cập http sang https. Nó cũng chuyển hướng https -> vòng lặp chuyển hướng vô hạn. Tôi đã liệt kê nó trong chỉ thị Virtualhost được sử dụng cho http (cổng 80) ở trên, .htaccess không hỗ trợ chỉ thị đó và do đó Redirect không thể được sử dụng ở đây.
maikel

4

Thêm mã sau vào tệp .htaccess:

Options +SymLinksIfOwnerMatch
RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^ https://[your domain name]%{REQUEST_URI} [R,L]

Trong đó [tên miền của bạn] là tên miền của trang web của bạn.

Bạn cũng có thể chuyển hướng các thư mục cụ thể ra khỏi tên miền của mình bằng cách thay thế dòng cuối cùng của mã ở trên bằng:

RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L]

L và R có nghĩa là gì?
Aaron Franke

4

Làm mọi thứ được giải thích ở trên để chuyển hướng. Chỉ cần thêm "HTTP Strict Transport Security" vào tiêu đề của bạn. Điều này sẽ tránh được con người trong cuộc tấn công giữa.

Chỉnh sửa tệp cấu hình apache của bạn (/etc/apache2/sites-enables/website.conf và /etc/apache2/httpd.conf chẳng hạn) và thêm phần sau vào Virtualhost của bạn:

# Optionally load the headers module:
LoadModule headers_module modules/mod_headers.so

<VirtualHost 67.89.123.45:443>
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>

https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security


2

Để chuyển hướng tất cả các httpyêu cầu đến https, bạn có thể sử dụng:

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]

Nếu mod viết lại không được kích hoạt và bạn đang sử dụng apache 2.4, bạn cũng có thể sử dụng một lệnh Redirectbên trong ifđể chuyển hướng httpyêu cầu đếnhttps .

Apache 2.4.

<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>

2

Nếu bạn đang ở trong tình huống không thể truy cập trực tiếp cấu hình apache cho trang web của mình, điều mà nhiều nền tảng được lưu trữ vẫn bị hạn chế theo kiểu này, thì tôi thực sự sẽ khuyên bạn nên sử dụng phương pháp hai bước. Lý do tại sao Apache tự tài liệu rằng bạn nên sử dụng các tùy chọn cấu hình của họ trước tiên và trên hết là mod_rewrite cho HTTP sang HTTPS.

Đầu tiên, như đã đề cập ở trên, bạn sẽ thiết lập quy tắc .htaccess mod_rewrite của mình:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Sau đó, trong (các) tệp PHP của bạn (bạn cần thực hiện điều này ở bất kỳ nơi nào phù hợp với tình huống của bạn, một số trang web sẽ chuyển tất cả các yêu cầu thông qua một tệp PHP, các trang khác phục vụ các trang khác nhau tùy theo nhu cầu của chúng và yêu cầu được thực hiện ):

<?php if ($_SERVER['HTTPS'] != 'on') { exit(1); } ?>

Ở trên cần chạy TRƯỚC bất kỳ mã nào có khả năng lộ dữ liệu an toàn trong môi trường không bảo mật. Do đó, trang web của bạn sử dụng chuyển hướng tự động thông qua HTACCESS và mod_rewrite, trong khi (các) tập lệnh của bạn đảm bảo không có đầu ra nào được cung cấp khi không được truy cập thông qua HTTPS.

Tôi đoán hầu hết mọi người không nghĩ như vậy và do đó Apache khuyên bạn không nên sử dụng phương pháp này nếu có thể. Tuy nhiên, chỉ cần kiểm tra thêm về kết thúc phát triển để đảm bảo dữ liệu của người dùng của bạn được an toàn. Hy vọng rằng điều này sẽ giúp người khác có thể phải xem xét sử dụng các phương pháp không được đề xuất do các hạn chế đối với dịch vụ lưu trữ của chúng tôi.


1

Thông qua .htaccess Điều này sẽ giúp.

RewriteEngine On


RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

Ngoài ra, hãy tham khảo điều này để biết thêm chi tiết. Làm thế nào để chuyển hướng http đến Https?


1
Đây là giải pháp phù hợp cho bất kỳ ai gặp phải "Quá nhiều lỗi chuyển hướng" và không thể thay đổi thuộc tính allowOverride.
Evochrom

1

Trừ khi bạn cần mod_rewrite cho những thứ khác, sử dụng lệnh Apache core IF sẽ sạch hơn & nhanh hơn:

<If "%{HTTPS} == 'off'">
Redirect permanent / https://yoursite.com/
</If>

Bạn có thể thêm nhiều điều kiện hơn vào lệnh IF, chẳng hạn như đảm bảo một miền chính tắc duy nhất không có tiền tố www:

<If "req('Host') != 'myonetruesite.com' || %{HTTPS} == 'off'">
Redirect permanent / https://myonetruesite.com/
</If>

Có rất nhiều quán tính quen thuộc trong việc sử dụng mod_rewrite cho mọi thứ, nhưng hãy xem điều này có hiệu quả với bạn không.

Thông tin thêm: https://httpd.apache.org/docs/2.4/mod/core.html#if

Để xem nó hoạt động (thử mà không có www. Hoặc https: // hoặc với .net thay vì .com): https://nohodental.com/ (một trang web tôi đang làm việc).


1

lấy mã này cho bạn .htaccess tệp Tự động chuyển hướng HTTP sang HTTPS

RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]


Xin chào, cảm ơn vì câu trả lời, câu trả lời của bạn bổ sung những câu trả lời hiện có nào khác không có?
Gricey

Về loại câu hỏi tương tự. Bất cứ ai có thể giúp đỡ với câu hỏi dưới đây? stackoverflow.com/questions/59503217/
Mạnh

0

Tôi đã tìm thấy một phương pháp để buộc tất cả các trang trong trang web của tôi chuyển hướng từ http sang tương tự các trang trên https hoạt động với tôi.

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

0
 Redirect 301 / https://example.com/

(làm việc cho tôi khi không có câu trả lời nào ở trên hoạt động)

Tặng kem:

ServerAlias www.example.com example.com

( không tìm thấy https: // www .example.com)


0

Điều này chuyển hướng tất cả các URL đến https và www

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC,OR]
RewriteCond %{HTTP_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]

0

Nếu bạn muốn làm điều đó từ máy chủ tomcat, hãy làm theo các bước dưới đây

Trong Máy chủ HTTP Apache Tomcat (8.5.x) độc lập, làm cách nào để định cấu hình nó để nếu người dùng nhập www.domain.com, họ sẽ tự động được chuyển tiếp đến trang web https (www.domain.com).

Phương pháp 2 bước bao gồm các bước sau trong [Tomcat_base] /conf/web.xml của bạn trước thẻ đóng

step 1: 
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOnly</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>

và cài đặt các cài đặt trình kết nối [Tomcat_base] /conf/server.xml:

step 2:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="443"/>
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="[keystorelocation]" type="RSA" />
</SSLHostConfig>
</Connector>

Lưu ý: Nếu bạn đã thực hiện cấu hình https và cố gắng chuyển hướng chỉ làm bước 1.



-1

Một khía cạnh khác cho vấn đề này là khi Load Balancer phát huy tác dụng.

Tình huống như sau: - Lưu lượng truy cập từ trình duyệt đến Load Balancer và ngược lại, là (nên là) HTTPS - Lưu lượng giữa Load Balancer và WebServer thực tế là HTTP.

Vì vậy, tất cả các biến yêu cầu máy chủ trong PHP hoặc Apache cho thấy kết nối chỉ là HTTP. Và các thư mục HTTP và HTTPS trên Máy chủ là như nhau.

RewriteCondition trong câu trả lời được phê duyệt không hoạt động. Nó cung cấp cho một vòng lặp hoặc nó chỉ không hoạt động.

Câu hỏi là: Làm thế nào để điều này hoạt động trên Load Balancer.

(Hoặc là Trình cân bằng tải được cấu hình sai. Đó là điều tôi hy vọng vì sau đó tôi có thể chuyển vấn đề sang công ty Webhosting :-))


Thay vào đó, việc chuyển hướng sẽ chỉ xảy ra trên bộ cân bằng tải. Tùy thuộc vào loại cân bằng tải, điều này có thể có trong cấu hình, hoặc đó là một trường hợp apache, nơi câu trả lời được chấp nhận sẽ hoạt động. Chỉ không làm điều đó trên các nút duy nhất.
marc82ch

-1

Nếu bạn đang sử dụng Bộ cân bằng tải đàn hồi của Dịch vụ web Amazon chấp nhận lưu lượng https và định tuyến nó đến (các) máy chủ của bạn bằng http, thì cách chính xác để chuyển hướng tất cả lưu lượng truy cập http sang https được mô tả tại đây: https://aws.amazon. com / premium hỗ trợ / kiến ​​thức trung tâm / chuyển hướng-http-https-elb

Sử dụng tiêu đề X-Forwarded-Proto (chứa http hoặc https) luôn được bao gồm trong các yêu cầu http từ bộ cân bằng tải, như được mô tả ở đây: https://docs.aws.amazon.com/elasticloadbalANCE/latest/ classic / x- tiêu đề chuyển tiếp.html

Trong tệp httpd.conf:

<VirtualHost *:80>

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

</VirtualHost>

Hoặc trong tệp .htaccess gốc của bạn:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

Phần thưởng: nó sẽ không cố chuyển hướng lưu lượng http trên máy phát triển cục bộ của bạn.


-1

Nó hoạt động với tôi:

<IfModule mod_rewrite.c>
 RewriteEngine On
  RewriteCond %{HTTPS} !on
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

và ví dụ : http: // server / foo? email = someone% 40example.com chuyển hướng bình thường mà không gặp sự cố nào. Tệp .htaccess nằm trong thư mục gốc của trang web (ví dụ có tên là public_html). Có thể sử dụng RewriteCond% {SERVER_PORT}! ^ 443 $ thay vì RewriteCond% {HTTPS}!

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.