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?
http://
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?
http://
Câu trả lời:
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 Redirect
thay thế. Xem câu trả lời này .
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
http://server/foo?email=someone%40example.com
chuyển hướng đến https://server/foo?email=someone%2540example.com
tứ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.
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.
Các tài liệu Apache khuyên không nên sử dụng viết lại:
Để chuyển hướng
http
URL đếnhttps
, 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 .htaccess
câ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.
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"
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]
[L]
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. )
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]
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 OR
cờ ở đ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 .
Đâ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
.htaccess
đi? Ngoài ra, liên kết đó là chết.
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]
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.
Đâ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
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 .htaccess
tậ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 $ _SERVER và hàm tiêu đề :
if (!$_SERVER['HTTPS']) {
header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
}
.htaccess
tập tin?
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à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
Để chuyển hướng tất cả các http
yê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 Redirect
bên trong if
để chuyển hướng http
yêu cầu đếnhttps
.
Apache 2.4.
<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
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.
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?
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).
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]
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]
Đ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]
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.
Nếu bạn đang sử dụng Apache, mod_rewrite là giải pháp đơn giản nhất và có rất nhiều tài liệu trực tuyến về cách thực hiện điều đó. Ví dụ: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html
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 :-))
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.
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}!
httpd
, không phải với PHP.