.htaccess chuyển hướng http thành https


83

Tôi có một url cũ ( www1.test.net) và tôi muốn chuyển hướng nó đến https://www1.test.net
Tôi đã triển khai và cài đặt chứng chỉ SSL của chúng tôi trên trang web của mình.
Đây là tệp cũ của tôi .htaccess:

RewriteEngine On
RewriteRule !\.(js|gif|jpg|png|css|txt)$ public/index.php [L]
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ public/$1 [L]

Làm cách nào để định cấu hình .htaccesstệp của tôi để url tự động chuyển hướng đến https?
Cảm ơn!


Nếu dòng thứ hai nhằm mục đích không thực hiện chuyển hướng nếu đường dẫn trỏ đến tệp thực (và bạn đang liệt kê các phần mở rộng dự kiến ​​có thể có), bạn có thể làm cho nó linh hoạt hơn bằng cách thay thế bằng kiểm tra tệp hiện có: RewriteCond %{REQUEST_FILENAME} !-f tiếp theo là chuyển hướng của bạn.
diamondsea

Câu trả lời:


113

Cập nhật 2016

Vì câu trả lời này nhận được một số sự chú ý, tôi muốn gợi ý một cách được khuyến nghị hơn để thực hiện việc này bằng cách sử dụng Máy chủ ảo: Apache: Redirect SSL

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

<VirtualHost _default_:443>
   ServerName mysite.example.com
   DocumentRoot /usr/local/apache2/htdocs
   SSLEngine On
# etc...
</VirtualHost>

Câu trả lời cũ, điều khó hiểu là cổng ssl của bạn không được đặt thành 80, điều này sẽ hoạt động:

RewriteEngine on

# force ssl
RewriteCond     %{SERVER_PORT} ^80$
RewriteRule     ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

Lưu ý rằng đây phải là quy tắc viết lại đầu tiên của bạn.

Chỉnh sửa: Đoạn mã này thực hiện những việc sau. Kiểm tra RewriteCond (ition) ướt hơn ServerPort của yêu cầu là 80 (là cổng http mặc định, nếu bạn chỉ định một cổng khác, bạn sẽ phải điều chỉnh điều kiện cho nó). Nếu vậy, chúng tôi đối sánh toàn bộ url (.*)và chuyển hướng nó đến https-url. %{SERVER_NAME}có thể được thay thế bằng một url cụ thể, nhưng bằng cách này, bạn không phải thay đổi mã cho các dự án khác. %{REQUEST_URI}là phần url sau TLD (tên miền cấp cao nhất), vì vậy bạn sẽ được chuyển hướng đến nơi bạn đến, nhưng dưới dạng https.


1
Cảm ơn cảm ơn ... nó hoạt động ...: D Nhưng bạn có thể giải thích tại sao nó hoạt động được không? ... cảm ơn ... ^^
Bàn Chân Trần

1
rất vui vì nó đã làm việc cho bạn. kiểm tra câu trả lời được cập nhật để giải thích trên mã. Điều này có đủ cho bạn không?
Jojo

1
"Lưu ý rằng đây phải là quy tắc viết lại đầu tiên của bạn." @Jojo Đã cứu người đàn ông của cuộc đời tôi: *
Ivan Shulev

1
Để thêm vào lời giải thích. "[Cờ [L]] ( httpd.apache.org/docs/2.4/rewrite/flags.html#flag_l ) khiến mod_rewrite ngừng xử lý bộ quy tắc." Thông thường bạn chỉ muốn thêm điều này theo mặc định. "Việc sử dụng [cờ [R]] ( httpd.apache.org/docs/2.4/rewrite/flags.html#flag_r ) khiến chuyển hướng HTTP được cấp cho trình duyệt." Nếu vắng mặt, chuyển hướng sẽ là nội bộ, điều này sẽ làm mất ý nghĩa của việc sử dụng HTTPS. Theo mặc định, chuyển hướng đã phát hành có trạng thái 302 (chuyển hướng tạm thời). Nếu bạn muốn trình duyệt ("vĩnh viễn") lưu vào bộ đệm URL mới, hãy sử dụng [R=301]thay thế.
Jānis Elmeris

1
Đối với giải pháp VirtualHost, không rõ nơi đặt câu lệnh "Chuyển hướng thường trực" trong trường hợp thiết lập phức tạp. Tôi giả định ở gần đầu, và nó hoạt động.
eyal_katz

170

Tôi sử dụng cách sau để chuyển hướng thành công tất cả các trang trong miền của tôi từ http sang https:

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

Lưu ý rằng điều này sẽ chuyển hướng bằng cách sử dụng 301 'permanently moved'chuyển hướng, điều này sẽ giúp chuyển thứ hạng SEO của bạn.

Để chuyển hướng bằng cách sử dụng 302 'temporarily moved'thay đổi[R=302,L]


5
câu này phù hợp hơn câu trả lời được chấp nhận "hacky"
am05mhz

7
Trong một số trường hợp, X-Forwarded-Proto là cần thiết RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
Kuzeko

1
cho đến nay câu trả lời hay hơn ở đây
lướt qua

Điều này được làm việc cho tôi trong máy chủ Godaddy. @Bradley Tuyệt vời !!
vishnu

Điều này đã hoạt động mọi lúc đối với tôi trong nhiều môi trường máy chủ và thiết lập trang web. Nên là câu trả lời đề nghị IMHO.
John Contarino

57

Đây là cách tốt nhất cho www và cho người dùng https, proxy chứ không phải proxy.

RewriteEngine On

### WWW & HTTPS

# ensure www.
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

### WWW & HTTPS

1
làm thế nào để chuyển hướng đến không phải www?
Elyor

Đây là câu trả lời tốt nhất cho những ai %{HTTPS} offchưa đủ
NoodleOfDeath 13/04/19

10

Tôi buộc https với mã sau:

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

1
@Niby hãy kiểm tra ngày trả lời của tôi và "câu trả lời đã có".
Arda

6

Trong trường hợp kết nối HTTPS / SSL được kết thúc tại bộ cân bằng tải và tất cả lưu lượng được gửi đến các phiên bản trên cổng 80, quy tắc sau sẽ hoạt động để chuyển hướng lưu lượng không an toàn.

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

Đảm bảo mod_rewritemô-đun được tải.


4

Đang tìm kiếm cách tốt nhất để chuyển hướng, tôi đã tìm thấy điều này (đến từ html5boilerplate):

# ----------------------------------------------------------------------
# | HTTP Strict Transport Security (HSTS)                              |
# ----------------------------------------------------------------------

# Force client-side SSL redirection.
#
# If a user types `example.com` in their browser, even if the server
# redirects them to the secure version of the website, that still leaves
# a window of opportunity (the initial HTTP connection) for an attacker
# to downgrade or redirect the request.
#
# The following header ensures that browser will ONLY connect to your
# server via HTTPS, regardless of what the users type in the browser's
# address bar.
#
# (!) Remove the `includeSubDomains` optional directive if the website's
# subdomains are not using HTTPS.
#
# http://www.html5rocks.com/en/tutorials/security/transport-layer-security/
# https://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14#section-6.1
# http://blogs.msdn.com/b/ieinternals/archive/2014/08/18/hsts-strict-transport-security-attacks-mitigations-deployment-https.aspx

Header set Strict-Transport-Security "max-age=16070400; includeSubDomains"

Có thể nó sẽ giúp ích cho ai đó trong năm 2017! :)


Vào năm 2017, đây sẽ là câu trả lời được chấp nhận. Nhưng nó phải chứa điều đó để kích hoạt HSTS qua tệp .htacces (câu hỏi được gắn thẻ này), bạn phải bỏ qua các thẻ IfModule. Nếu bạn chỉnh sửa câu trả lời của bạn với điều đó tôi sẽ sẵn sàng liên kết đến đây từ câu trả lời được chấp nhận
Jojo

Xin chào Jojo! xin lỗi vì câu trả lời cuối này, bạn có nghĩa là loại bỏ cả hai # <IfModule mod_headers.c># </IfModule>dòng?
LIIT

này LIIT, vâng đó là những gì tôi muốn nói.
Jojo

1
Mặc dù điều này là tốt và giúp đạt được hoặc hỗ trợ (có thể) hiệu quả mong muốn, điều này không chuyển hướng các yêu cầu http đến https, và do đó, không trả lời câu hỏi. Nó chỉ hoạt động nếu khách hàng đã truy cập trang web qua HTTPS (trong khoảng tuổi tối đa được chỉ định). Vì vậy, nó phải luôn đi kèm với một chuyển hướng thích hợp.
Nicolai Ehemann

4

Chèn mã này vào tệp .htaccess của bạn. Và nó sẽ hoạt động

RewriteCond %{HTTP_HOST} yourDomainName\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://yourDomainName.com/$1 [R,L]

2

Thêm mã này vào cuối tệp .htaccess của bạn

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

1
Có thể là do mod_rewrite không được bật trong câu trả lời này cũng như trong những câu trả lời khác.
keji

Chỉ cần thêm RewriteEngine onvào đầu này sẽ làm cho nó hoạt động.
Giacomo1968

2

Thêm phần sau vào đầu .htaccess

RewriteEngine On
RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

1

Tôi cũng gặp vấn đề với việc chuyển hướng. Tôi đã thử mọi thứ được đề xuất trên Stackoverflow. Một trường hợp tôi tự tìm thấy là:

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP:SSL} !=1 [NC]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

1

Điều này đảm bảo rằng chuyển hướng hoạt động cho tất cả các tổ hợp proxy trong nước.

Điều này bao gồm máy chủ web <http> proxy <https> case client .

# behind proxy
RewriteCond %{HTTP:X-FORWARDED-PROTO} ^http$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

# plain
RewriteCond %{HTTP:X-FORWARDED-PROTO} ^$
RewriteCond %{REQUEST_SCHEME} ^http$ [NC,OR]
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

-1

Buộc HTTPS với .htaccessTệp

==> Chuyển hướng tất cả lưu lượng truy cập web: -

Để buộc tất cả lưu lượng truy cập web sử dụng HTTPS, hãy chèn các dòng mã sau vào .htaccesstệp trong thư mục gốc của trang web của bạn.

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

==> Chỉ chuyển hướng tên miền được chỉ định: -

Để buộc một miền cụ thể sử dụng HTTPS, hãy sử dụng các dòng mã sau trong .htaccesstệp trong thư mục gốc của trang web của bạn:

RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteEngine On 
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

Nếu cách này không hiệu quả, hãy thử xóa hai dòng đầu tiên.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

Đảm bảo thay thế example.com bằng tên miền mà bạn đang cố ép buộc thành https. Ngoài ra, bạn cần thay thế www.example.com bằng tên miền thực của mình.

==> Thư mục được chỉ định chuyển hướng: -

Nếu bạn muốn buộc SSL trên một thư mục cụ thể, hãy chèn mã bên dưới vào .htaccesstệp được đặt trong thư mục cụ thể đó:

RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} folder
RewriteRule ^(.*)$ https://www.example.com/folder/$1 [R=301,L]

Đảm bảo rằng bạn thay đổi tham chiếu thư mục thành tên thư mục thực. Sau đó, hãy đảm bảo thay thế www.example.com/folder bằng tên miền thực và thư mục mà bạn muốn sử dụng SSL.


-1

Thay thế miền của bạn bằng domainname.com, miền đó đang hoạt động với tôi.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^domainname\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.domainname.com/$1 [R,L]

2
Vui lòng không chỉ đăng mã dưới dạng câu trả lời, mà hãy cung cấp giải thích mã của bạn làm gì và cách nó giải quyết vấn đề của câu hỏi. Các câu trả lời kèm theo lời giải thích thường hữu ích hơn và có chất lượng tốt hơn, đồng thời có nhiều khả năng thu hút sự ủng hộ hơn.
Mark Rotteveel
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.