.htaccess 및 mod_rewrite를 사용하여 SSL/https 강제 적용
PHP 고유의 .htaccess 및 mod_rewrite 페이지를 사용하여 SSL/https에 강제적으로 접속하려면 어떻게 해야 합니까?
Apache의 경우 를 사용하여 SSL을 강제 적용할 수 있습니다.
이 지시어는 현재 연결에 대해 HTTP over SSL(즉, HTTPS)을 사용하도록 설정하지 않는 한 액세스를 금지합니다.이것은, SSL 대응의 가상 호스트 또는 디렉토리내에서, 보호할 필요가 있는 것을 표시하는 설정 에러로부터 방어하기 위해서 매우 편리합니다.이 지시문이 있는 경우 SSL을 사용하지 않는 모든 요청이 거부됩니다.
단, https로 리다이렉트 할 수 없습니다.리다이렉트 하려면 .htaccess 파일에서 다음을 시도합니다.
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
또는 다음 장소에서 제공되는 다양한 접근법 중 하나
프로바이더가 .htaccess를 디세블로 했을 경우 PHP 내에서 이 문제를 해결할 수도 있습니다(당신이 요구했기 때문에 가능성이 낮지만 어쨌든).
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
if(!headers_sent()) {
header("Status: 301 Moved Permanently");
header(sprintf(
'Location: https://%s%s',
$_SERVER['HTTP_HOST'],
$_SERVER['REQUEST_URI']
));
exit();
}
}
mod_rewrite프록시 서버와 프록시되지 않은 서버 모두에 적합한 솔루션입니다.
CloudFlare, AWS Elastic Load Balancing, Heroku, OpenShift 또는 기타 클라우드/PaaS 솔루션을 사용하고 있으며 일반 HTTPS 리다이렉트에서 리다이렉트 루프가 발생하는 경우 대신 다음 스니펫을 사용해 보십시오.
RewriteEngine On
# If we receive a forwarded http request from a proxy...
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]
# ...or just a plain old http request directly from the client
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on
# Redirect to https version
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
PHP 솔루션
Gordon의 매우 포괄적인 답변에서 직접 인용한 질문에서 HTTPS/SSL 접속을 강제하기 위한 페이지 고유성이 언급되었습니다.
function forceHTTPS(){
$httpsURL = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
if( count( $_POST )>0 )
die( 'Page should be accessed with HTTPS, but a POST Submission has been sent here. Adjust the form to point to '.$httpsURL );
if( !isset( $_SERVER['HTTPS'] ) || $_SERVER['HTTPS']!=='on' ){
if( !headers_sent() ){
header( "Status: 301 Moved Permanently" );
header( "Location: $httpsURL" );
exit();
}else{
die( '<script type="javascript">document.location.href="'.$httpsURL.'";</script>' );
}
}
}
다음 PHP를 하여 PHP를 사용할 수 .require()기능이 , (실행)합니다.forceHTTPS()★★★★★★ 。
HTACCESS / mod_rewrite 솔루션
저는 개인적으로 이러한 솔루션을 구현한 적이 없습니다(단순함을 위해 위의 솔루션과 같은 PHP 솔루션을 사용하는 경향이 있습니다). 하지만 적어도 다음 사항은 좋은 시작일 수 있습니다.
RewriteEngine on
# Check for POST Submission
RewriteCond %{REQUEST_METHOD} !^POST$
# Forcing HTTPS
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{SERVER_PORT} 80
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_secure [OR]
RewriteCond %{REQUEST_URI} ^something_else_secure
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Forcing HTTP
RewriteCond %{HTTPS} =on [OR]
RewriteCond %{SERVER_PORT} 443
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_public [OR]
RewriteCond %{REQUEST_URI} ^something_else_public
RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
Mod-Rewrite 기반 솔루션:
htaccess에서 다음 코드를 사용하면 모든 http 요구가 자동으로 https로 전송됩니다.
RewriteEngine on
RewriteCond %{HTTPS}::%{HTTP_HOST} ^off::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]
그러면 비ww 및 www http 요청이 www 버전의 https로 리디렉션됩니다.
다른 솔루션 (Apache 2.4*)
RewriteEngine on
RewriteCond %{REQUEST_SCHEME}::%{HTTP_HOST} ^http::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]
%{와 같은 낮은 버전의 Apache에서는 작동하지 않습니다.REQUEST_SCHEME 변수가 2.4 이후 mod-rewrite에 추가되었습니다.
Apache는 디렉토리 깊이에서 여러 .htaccess 파일을 사용할 때 상속 규칙이 가장 나쁘다는 점을 지적하고 싶습니다.두 가지 주요 함정:
- 기본적으로는 가장 깊은 .htaccess 파일에 포함된 규칙만 수행됩니다.다음을 지정해야 합니다.
RewriteOptions InheritDownBeforedirective(또는 유사)를 사용하여 이를 변경합니다.(질문 참조) - 패턴은 지정된 규칙을 가진 .htaccess 파일이 포함된 상위 디렉토리가 아니라 하위 디렉토리에 상대적인 파일 경로에 적용됩니다.(설명 참조)
즉, 하위 디렉터리에서 다른 .htaccess 파일을 사용하면 Apache Wiki에서 제안된 글로벌 솔루션이 작동하지 않습니다.다음과 같은 수정 버전을 작성했습니다.
RewriteEngine On
# This will enable the Rewrite capabilities
RewriteOptions InheritDownBefore
# This prevents the rule from being overrided by .htaccess files in subdirectories.
RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [QSA,R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e. http://www.example.com/foo/ to https://www.example.com/foo/
심플하고 간단하며 다음 항목만 추가
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
이 코드를 사용할 수 있습니다.
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
간단한 것:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.example\.com)(:80)? [NC]
RewriteRule ^(.*) https://example.com/$1 [R=301,L]
order deny,allow
url을 example.com으로 바꿉니다.
이 코드를 사용해 보세요.다음과 같은 모든 버전의 URL에서 동작합니다.
- website.com
- www.website.com
- http://website.com
-
RewriteCond %{HTTPS} off RewriteCond %{HTTPS_HOST} !^www.website.com$ [NC] RewriteRule ^(.*)$ https://www.website.com/$1 [L,R=301]
언급URL : https://stackoverflow.com/questions/4398951/force-ssl-https-using-htaccess-and-mod-rewrite
'programing' 카테고리의 다른 글
| MySQL 테이블을 두 열로 정렬합니다. (0) | 2022.09.26 |
|---|---|
| Foreach 루프에서 어레이 요소를 삭제하려면 어떻게 해야 합니까? (0) | 2022.09.26 |
| MySQL에서 원하는 항목을 삭제하는 방법 (0) | 2022.09.26 |
| MariaDB 및 1064 오류 (0) | 2022.09.26 |
| 문자열 내의 모든 문자에 각 루프를 적용하려면 어떻게 해야 하나요? (0) | 2022.09.26 |