it-swarm.dev

모든 HTTP 요청을 HTTPS로 리디렉션하는 방법

내 사이트 (예 : http://www.example.com)의 모든 안전하지 않은 HTTP 요청을 HTTPS (https://www.example.com)로 리디렉션하려고합니다. PHP btw를 사용하고 있습니다. .htaccess에서이 작업을 수행 할 수 있습니까?

266
Cat

Update : 이 답변은 몇 년 전에 받아 들여졌지만 Apache 설명서에서 그 접근 방식은 현재 권장되지 않음 입니다. . 대신 Redirect을 사용하십시오. 이 답변 을 참조하십시오.


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

소스

282
Reese Moore

Apache 문서 다시 쓰기를 사용하지 말 것을 권장합니다.

http URL을 https으로 리디렉션하려면 다음을 수행하십시오.

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

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

이 스 니펫은 질문에서와 같이 주 서버 구성 파일 인 not into .htaccess로 이동해야합니다.

이 기사는 질문이 제기되고 응답 된 후에 만 ​​나타날 수 있지만 현재 갈 방법이라고합니다.

315
ssc

301 리디렉션을 권장합니다.

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

this question 에서 말했듯이 보안에 대한 잘못된 인상을 줄 수 있으므로 모든 HTTP 요청을 해당 HTTPS로 맹목적으로 리디렉션하지 않는 것이 좋습니다. 대신 HTTP 사이트의 "루트"를 HTTPS 사이트의 루트로 리디렉션하고 거기에서 HTTPS로만 연결해야합니다.

문제는 HTTPS 사이트의 일부 링크 또는 양식으로 인해 클라이언트가 HTTP 사이트로 요청을 보내면 리디렉션 전에 컨텐츠가 표시된다는 것입니다.

예를 들어 HTTPS를 통해 게재 된 페이지 중 하나에 <form action="http://example.com/doSomething">라는 양식이 있고 명확하게 전송해서는 안되는 일부 데이터를 보내는 경우 브라우저는 먼저 전체 요청 (엔터티 포함, POST 인 경우)을 보냅니다. )를 먼저 HTTP 사이트에 추가하십시오. 리디렉션은 브라우저로 즉시 전송되며 많은 사용자가 경고를 비활성화하거나 무시하므로 무시 될 수 있습니다.

물론, HTTPS 사이트에 연결되어야하지만 HTTP 사이트에 대한 링크를 제공하는 실수는 HTTPS 사이트와 동일한 IP 주소의 HTTP 포트에서 무언가 수신 대기하는 즉시 문제를 일으킬 수 있습니다. 그러나 두 사이트를 "미러"로 유지하면 사용자가 HTTPS로 리디렉션하여 자동으로 수정한다고 가정하는 경향이있을 수 있지만 실수는 너무 늦기 때문에 실수 할 가능성이 증가 할뿐입니다. ( 이 질문에서)와 비슷한 토론이있었습니다. )

35
Bruno

도메인의 https 및 www에 대한 최선의 방법은

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

이것은 작동하지만 최선은 아닌 HTML 리디렉션 접근 방식입니다.

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

PHP 접근법

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

.htaccess approch

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

에서 복사 : www.letuslook.org

13
Timothy Nwanwene

Http에서 https로 리디렉션하는 방법이 마음에 듭니다. 각 사이트에 대해 편집 할 필요가 없기 때문입니다.

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

.htaccess 파일에서 다음 코드를 사용하면 방문자가 사이트의 HTTPS 버전으로 자동 리디렉션됩니다.

RewriteEngine On

RewriteCond %{HTTPS} off

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

기존 .htaccess 파일이있는 경우 :

RewriteEngine On을 복제하지 마십시오.

RewriteCond와 RewriteRule을 시작하는 라인이 이미 존재하는 RewriteEngine을 따르는 지 확인하십시오.

6
OpenWebWar

GoDaddy.com에 따라 .htaccess를 사용하여 HTTP를 HTTPS로 리디렉션하는 올바른 방법입니다. 코드의 첫 번째 줄은 자명하다. 코드의 두 번째 줄은 HTTPS가 꺼져 있는지 확인하고, 그렇다면 세 번째 코드 줄을 실행하여 HTTP를 HTTPS로 리디렉션합니다. 그렇지 않으면 세 번째 코드 줄이 무시됩니다.

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
AnarchyOutlaw

최상의 솔루션은 요구 사항에 따라 다릅니다. 이것은 약간의 문맥이 추가 된 이전에 게시 된 답변의 요약입니다.

Apache 웹 서버로 작업하고 구성을 변경할 수있는 경우 Apache 설명서 :

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

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

하지만 .htaccess 파일에서 할 수 있는지 물어 보았습니다. 이 경우 Apache의 RewriteEngine :을 사용할 수 있습니다.

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

모든 것이 잘 작동하고 브라우저가이 리디렉션을 기억하게하려면 마지막 행을 다음과 같이 변경하여 영구적으로 선언 할 수 있습니다.

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

그러나이 리디렉션에서 마음을 바꿀 수 있다면 조심하십시오. 브라우저는 매우 오랜 시간 동안 기억하고 변경되었는지 확인하지 않습니다.

웹 서버 구성에 따라 RewriteEngine On 첫 줄이 필요하지 않을 수도 있습니다.

PHP 솔루션을 찾으려면 $ _SERVER 배열헤더 함수 를 살펴보십시오.

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

리다이렉션을 위해 위에서 설명한 모든 작업을 수행하십시오. 헤더에 "HTTP Strict Transport Security"를 추가하기 만하면됩니다. 이것은 중간 공격에서 사람을 피할 것입니다.

Apache 구성 파일 (예 : /etc/Apache2/sites-enabled/website.conf 및 /etc/Apache2/httpd.conf)을 편집하여 VirtualHost에 다음을 추가하십시오.

# 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

4
Waqas

.htaccess 파일에 다음 코드를 추가하십시오.

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

[귀하의 도메인 이름]은 귀하의 웹 사이트 도메인 이름입니다.

위 코드의 마지막 줄을 다음과 같이 바꾸면 도메인 이름에서 특정 폴더를 리디렉션 할 수도 있습니다.

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

모든 http 요청을 https으로 리디렉션하려면 다음을 사용할 수 있습니다.

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

Mod-rewrite가 활성화되어 있지 않고 Apache 2.4에있는 경우 Redirect 내부 if 지시어를 사용하여 http 요청을 https으로 리디렉션 할 수 있습니다.

Apache 2.4.

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

사이트에 직접 Apache 구성에 액세스 할 수없는 상황에있는 경우 (많은 호스트 플랫폼이이 방식으로 여전히 제한되어있는 경우) 실제로 두 단계 접근 방식을 권장합니다. 아파치가 스스로 HTTP를 HTTP에 mod_rewrite보다 먼저 설정 옵션을 사용해야한다는 이유를 설명한다.

먼저 위에서 언급 한 것처럼 .htaccess mod_rewrite 규칙을 설정합니다.

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

그런 다음 귀하의 PHP 파일 (귀하의 상황에 적합한 곳에서이 작업을 수행해야하는 경우), 일부 사이트는 PHP 파일 하나를 통해 모든 요청을 퍼널합니다. 요구 사항과 요청 내용에 따라 다양한 페이지 제공).

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

위의 코드는 안전하지 않은 환경에서 보안 데이터를 노출시킬 수있는 코드를 실행해야합니다. 따라서 사이트는 HTACCESS 및 mod_rewrite를 통한 자동 리디렉션을 사용하지만 스크립트는 HTTPS를 통해 액세스하지 않을 때 출력이 제공되지 않도록합니다.

나는 대부분의 사람들이 이렇게 생각하지 않는다고 생각하고, 따라서 Apache는 가능한 경우이 방법을 사용하지 말 것을 권장합니다. 그러나 개발 단계에서 사용자의 데이터가 안전한지 확인하기 위해 추가 검사가 필요합니다. 바라기를 이것은 우리의 접대 서비스 끝에 제한 때문에 추천되지 않는 방법 사용으로 볼 필요가 있을지도 모른 다른 누군가를 돕는다.

2
F. Scott Gale

.htaccess를 통해 도움이 될 것입니다.

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]

또한 자세한 내용은이 항목을 참조하십시오. HTTP를 HTTP로 리디렉션하는 방법은 무엇입니까?

1
Roshan Padole

다른 것들을 위해 mod_rewrite가 필요하지 않다면 Apache core IF 지시어를 사용하는 것이 더 빠르고 깨끗합니다.

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

Www 지시문없이 하나의 표준 도메인을 보장하는 등 IF 지시문에 조건을 더 추가 할 수 있습니다.

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

Mod_rewrite를 모든 것에 익숙하게 사용하는 데에는 많은 익숙 함이 있지만, 이것이 효과가 있는지보십시오.

추가 정보 : https://httpd.Apache.org/docs/2.4/mod/core.html#if

그것을 작동 시키려면 (www가 없거나 https : //를 사용하거나 .com 대신 .net을 사용하십시오.) : https://nohodental.com/ (내가 작업하고있는 사이트).

1
SashaK

Apache를 사용하고 있다면, mod_rewrite가 가장 쉬운 해결책이며, 온라인으로 문서를 작성하는 방법이 많이 있습니다. 예 : http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html

0
vcsjones

Tomcat 서버에서 수행하려면 아래 단계를 수행하십시오.

독립형 Apache Tomcat (8.5.x) HTTP 서버에서 사용자가 www.domain.com을 입력하면 https (www.domain.com) 사이트로 자동 전달되도록 구성하는 방법.

닫는 태그 앞에 [Tomcat_base] /conf/web.xml에 다음을 포함시키는 2 단계 방법

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>

[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>

참고 : 이미 https 구성을 수행하고 경로 재 지정을 시도한 경우 1 단계 만 수행하십시오.

0
Bhaskara Arani

이 문제점의 다른 Edge는 Load Balancer가 작동 할 때입니다.

상황은 다음과 같습니다. - 브라우저에서 Load Balancer 로의 트래픽 및 HTTPS의 트래픽 - Load Balancer와 실제 WebServer 사이의 트래픽은 HTTP입니다.

따라서 PHP 또는 Apache의 모든 서버 요청 변수는 연결이 HTTP임을 보여줍니다. 그리고 서버의 HTTP 및 HTTPS 디렉토리는 동일합니다.

승인 된 응답의 RewriteCondition이 작동하지 않습니다. 그것은 루프를 제공하거나 그냥 작동하지 않습니다.

문제는 Load Balancer에서이 작업을 수행하는 방법입니다.

(또는 Load Balancer가 잘못 구성된 것입니다. 그 이유는 WebHosting 회사에 문제를 넘길 수 있기 때문에 내가 원하는 것입니다 .-))

0
BertC

.htaccess 파일 HTTP를 자동으로 HTTPS로 리디렉션

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

0
Ehsan Sattari

그것은 나를 위해 작동합니다 :

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

예를 들어 http : // server/foo? email = someone % 40example.com 문제없이 정상적으로 리디렉션됩니다. 웹 사이트 루트 폴더에있는 .htaccess 파일 (예 : public_html) RewriteCond % {SERVER_PORT}! ^ 443 $ 대신 RewriteCond % {HTTPS}! on

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

(위의 답변 중 어느 것도 작동하지 않을 때 나를 위해 일했다)

보너스:

ServerAlias www.example.com example.com

(고정 https : // www . example.com을 찾을 수 없음)

0
aalesund

내 사이트의 모든 페이지를 HTTP에서 https의 아날로그 페이지로 리디렉션하는 방법을 찾았습니다.

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

Https 트래픽을 허용하고 http로 서버에 라우팅하는 Amazon Web Services Elastic Load Balancer를 사용하는 경우 모든 http 트래픽을 https로 리디렉션하는 올바른 방법은 https : // aws입니다. Amazon.com/premiumsupport/knowledge-center/redirect-http-https-elb

여기에 설명 된대로로드 밸런서의 http 요청에 항상 포함되어있는 X-Forwarded-Proto 헤더 (http 또는 https 포함)를 사용하십시오. https://docs.aws.Amazon.com/elasticloadbalancing/latest/classic/ x-forwarded-headers.html

Httpd.conf 파일에서 다음을 수행하십시오.

<VirtualHost *:80>

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

</VirtualHost>

또는 루트 .htaccess 파일에서 다음을 수행하십시오.

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

보너스 : 로컬 개발 컴퓨터에서 http 트래픽을 리디렉션하지 않습니다.

0
ScottyB