내 사이트의 모든 안전하지 않은 HTTP 요청 (예 http://www.example.com
:)을 HTTPS ( https://www.example.com
) 로 리디렉션하려고합니다 . PHP btw를 사용하고 있습니다. .htaccess에서이 작업을 수행 할 수 있습니까?
http://
내 사이트의 모든 안전하지 않은 HTTP 요청 (예 http://www.example.com
:)을 HTTPS ( https://www.example.com
) 로 리디렉션하려고합니다 . PHP btw를 사용하고 있습니다. .htaccess에서이 작업을 수행 할 수 있습니까?
http://
답변:
업데이트 : 이 답변은 몇 년 전에 받아 들여졌지만 이제는 Apache 설명서 에서이 방법을 권장하지 않습니다 . 사용Redirect
대신 . 이 답변을 참조하십시오 .
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
http://server/foo?email=someone%40example.com
리디렉션 https://server/foo?email=someone%2540example.com
하면 URL이 두 번 인용 됩니다 . @ ssc의 답변에 메소드를 사용하면이 문제가 없습니다.
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.
아파치 문서는 재 작성을 사용하여에 추천 :
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>
이 조각은, 주요 서버 구성 파일에 가야 하지 에 .htaccess
질문에 질문한다.
이 기사는 질문을하고 대답 한 후에 만 올 수 있지만 현재 진행중인 방법 인 것 같습니다.
permanent
키워드 를 사용하면 효과는 동일합니다 (브라우저는 301 리디렉션을 수신함). 예 :Redirect permanent "/" "https://example.com"
301 리디렉션을 권장합니다.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
[L]
이 질문 에서 말했듯 이 보안에 대한 잘못된 인상을 줄 수 있으므로 모든 HTTP 요청을 해당 HTTPS로 맹목적으로 리디렉션하지 않는 것이 좋습니다. 대신 HTTP 사이트의 "루트"를 HTTPS 사이트의 루트로 리디렉션하고 거기에서 HTTPS로만 연결해야합니다.
문제는 HTTPS 사이트의 일부 링크 또는 양식으로 인해 클라이언트가 HTTP 사이트로 요청을 보내면 리디렉션 전에 컨텐츠가 표시된다는 것입니다.
예를 들어, HTTPS를 통해 제공되는 페이지 중 하나 <form action="http://example.com/doSomething">
에 명확하게 보내지 말아야 할 일부 데이터를 전송 하는 양식이있는 경우 브라우저는 먼저 전체 요청 (엔터티, POST 인 경우)을 HTTP 사이트로 보냅니다. 먼저. 리디렉션은 브라우저로 즉시 전송되며 많은 사용자가 경고를 비활성화하거나 무시하므로 무시 될 수 있습니다.
물론, HTTPS 사이트로 연결되어야하지만 HTTP 사이트에 대한 링크를 제공하는 실수는 HTTPS 사이트와 동일한 IP 주소의 HTTP 포트에서 무언가 수신 대기하는 즉시 문제를 일으킬 수 있습니다. 그러나 두 사이트를 "미러"로 유지하면 사용자가 HTTPS로 리디렉션하여 자동으로 수정한다고 가정하는 경향이있을 수 있지만 실수는 너무 늦기 때문에 실수 할 가능성이 높아질 뿐이라고 생각합니다. ( 이 질문 에서 비슷한 토론이있었습니다 . )
도메인에서 https와 www를 사용하는 가장 좋은 방법은
RewriteCond %{HTTPS} off
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
이것이 작동하지만 가장 좋지 않은 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 접근
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
에서 복사 : www.letuslook.org
.htaccess
갑니까? 또한 해당 링크가 작동하지 않습니다.
http에서 https로 리디렉션하는이 방법이 마음에 듭니다. 각 사이트마다 편집 할 필요가 없기 때문입니다.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
.htaccess 파일에서 다음 코드를 사용하면 방문자가 사이트의 HTTPS 버전으로 자동 리디렉션됩니다.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
기존 .htaccess 파일이있는 경우 :
RewriteEngine On을 복제하지 마십시오.
RewriteCond 및 RewriteRule로 시작하는 행이 이미 존재하는 RewriteEngine On 바로 뒤에 오도록하십시오.
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
최상의 솔루션은 요구 사항에 따라 다릅니다. 다음은 일부 컨텍스트가 추가 된 이전에 게시 된 답변의 요약입니다.
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']);
}
.htaccess
파일 로 갈 수있는 것은 무엇입니까 ?
다음 코드를 .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]
리디렉션에 대해 위에서 설명한 모든 작업을 수행하십시오. 헤더에 "HTTP Strict Transport Security"를 추가하십시오. 이것은 중간 공격에 사람을 피할 것입니다.
아파치 구성 파일 (예 : /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
모든 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
.
아파치 2.4.
<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
많은 호스팅 플랫폼이 여전히 이런 방식으로 제한되어있는 사이트의 아파치 구성에 직접 액세스 할 수없는 상황이라면 실제로 2 단계 접근법을 권장합니다. Apache가 HTTP에서 HTTPS에 대한 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는 가능한 경우이 방법을 사용하지 않는 것이 좋습니다. 그러나 사용자의 데이터가 안전한지 확인하기 위해 개발 엔드를 추가로 확인하면됩니다. 이 방법은 호스팅 서비스의 제한으로 인해 권장되지 않는 방법을 사용해야하는 다른 사람에게 도움이되기를 바랍니다.
.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를 Https로 리디렉션하는 방법?
다른 것들에 대해 mod_rewrite가 필요하지 않으면 Apache 핵심 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/ (작업중인 사이트).
이 코드를 .htaccess 파일로 가져 오십시오. HTTP를 HTTPS로 자동 리디렉션
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
내 사이트의 모든 페이지를 http에서 https의 페이지 아날로그로 리디렉션하는 방법을 찾았습니다.
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
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 단계 만 수행하십시오.
Apache를 사용하는 경우 mod_rewrite가 가장 쉬운 솔루션이며이를 수행하는 방법에 대한 온라인 설명서가 많이 있습니다. 예를 들면 다음과 같습니다. http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html
이 문제와 다른 점은로드 밸런서가 작동 할 때입니다.
상황은 다음과 같습니다.-브라우저에서로드 밸런서로의 트래픽은 HTTPS입니다.-로드 밸런서와 실제 WebServer 간의 트래픽은 HTTP입니다.
따라서 PHP 또는 Apache의 모든 서버 요청 변수는 연결이 단지 HTTP임을 보여줍니다. 서버의 HTTP 및 HTTPS 디렉토리는 동일합니다.
승인 된 답변의 RewriteCondition이 작동하지 않습니다. 루프를 제공하거나 작동하지 않습니다.
질문은로드 밸런서에서이 작업을 수행하는 방법입니다.
(또는로드 밸런서가 잘못 구성되어 있습니다. 웹 호스팅 회사로 문제를 옮길 수 있기 때문에 기대하고있는 것입니다 :-))
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 트래픽을 리디렉션하려고 시도하지 않습니다.
그것은 나를 위해 작동합니다 :
<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}!에
httpd
PHP가 아닌을 통해이 작업을 수행 할 수 있습니다 .