HTTPS에서만 .htaccess에서 HSTS 헤더를 설정하는 방법 [닫힘]


82

내 웹 애플리케이션은 내가 제어하는 ​​다른 수의 호스트에서 실행됩니다. 각 가상 호스트의 Apache 구성을 변경할 필요가 없도록하기 위해 내 저장소에 .htaccess 파일을 사용하여 대부분의 구성을 추가하여 각 호스트의 기본 설정이 몇 줄이면됩니다. 이렇게하면 새 버전을 배포 할 때 구성을 변경할 수도 있습니다. 현재 .htaccess (un)는 헤더를 설정하고 일부 재 작성 마법을 수행하며 UA의 캐싱을 제어합니다.

.htaccess를 사용하여 응용 프로그램에서 HSTS를 활성화하고 싶습니다. 헤더 설정은 간단합니다.

Header always set Strict-Transport-Security "max-age=31536000"

그러나 사양에는 "HSTS 호스트는 비보안 전송을 통해 전달되는 HTTP 응답에 STS 헤더 필드를 포함해서는 안됩니다."라고 명시되어 있습니다. 따라서 HTTP 연결을 통해 보낼 때 헤더를 보내고 싶지 않습니다. http://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14를 참조하세요 .

환경 변수를 사용하여 헤더를 설정하려고했지만 거기에 갇혀있었습니다. 그 방법을 아는 사람?


Stack Overflow는 프로그래밍 및 개발 질문을위한 사이트입니다. 이 질문은 프로그래밍이나 개발에 관한 것이 아니기 때문에 주제에서 벗어난 것처럼 보입니다. 도움말 센터에서 내가 질문 할 수있는 항목을 참조 하세요 . 아마 슈퍼 사용자 또는 유닉스 및 리눅스 스택 교환 물어 더 나은 장소가 될 것입니다. Dev Ops에 대한 질문을 어디에 게시합니까?
jww

6
@jww .htaccess 파일은 내 웹 앱 저장소의 일부이며 개발자가 애플리케이션의 원하는 동작 (예 : 캐싱, URL 재 작성 및 올바른 헤더 설정)을 얻기 위해 유지 관리합니다. 질문은 여기 SO에서 거의 2 만 번 조회됩니다 (그리고 [apache], [.htaccess] 및 [mod-headers] 태그를 사용할 수 있음). 그래서 나는 그것이 여기서 주제에서 벗어난 것이라고 생각하지 않습니다.
nielsr

1
".htaccess 파일은 내 웹 앱 저장소의 일부이며 개발자가 유지 관리합니다 ..." -Stack Overflow에 포함되는 기준도 아닙니다. 좋은 냄새 테스트는 코드를 보여줄 수 있습니까? 이 경우 대답은 아니오입니다. 검사 후 Apache 구성 질문입니다. "이 질문은 거의 2 만 회 조회되었습니다 ..." -Stack Overflow는 덤핑 장입니다. 여기에서 주제를 벗어난 질문을 한 다음 검색 엔진에서 색인을 생성합니다. 이 현상의 다른 예로는 SSH를 통한 파일 전송이 있습니다 . 개발자들도 때때로 SSH를 사용합니다.
jww

답변:


113

쉽게 사용할 수있는 HTTPS 환경 변수가 분명히 있습니다. 같은 질문을 가진 사람들의 경우 :

Header set Strict-Transport-Security "max-age=31536000" env=HTTPS

2
이 설정은 어떤 파일로 만들어 졌습니까?
ted.strauss 2014

7
@ ted.strauss .htaccess파일 에 있습니다.
zen

어떤 이유로 내 서버에서 작동하지 않습니다. Apache 2.4
Andy

14
나에게도 효과가 없었습니다. 그러나 추가 "expr=%{HTTPS} == 'on'"는 작동했습니다. 그러면 전체 라인은 Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" "expr=%{HTTPS} == 'on'"입니다. always키워드 때문 일까요?
Adrian Föder 2011

3
조건 의 HTTPS env var 는 mod_rewrite 조건 (및 Apache expr)에서 일반적으로 볼 env=HTTPS수있는 서버 var 와 다릅니다 %{HTTPS}. 이것은 env 변수 이기 때문에 환경에 따라 다릅니다. 서버 구성. 때로는 설정되지 않습니다. 때로는 HTTPS서버 var 와 동일한 값이 할당 되므로 항상 "off"또는 "on"으로 설정되며 조건 env=HTTPS항상 true입니다! env=HTTPS단순히 env var가 "on"이 아닌 설정되었는지 여부를 테스트합니다. .) @ AdrianFöder가 제안한대로 Apache expr을 사용하는 것은 Apache 2.4+에서 권장됩니다.
MrWhite

29

nielsr의 답변을 구축하기 위해 .htaccess에서 다음을 사용 하여 도메인을 Chrome 브라우저로 하드 코딩하는 https://hstspreload.org 의 보안 배포 권장 사항을 충족했습니다 . 이렇게하면 하위 도메인 전체에 HSTS가 적용되며 사전로드 목록에 포함하는 것은 쉽게 취소 할 수 없으므로 rtfm.

<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
</IfModule>

6
예-전체 도메인에서 HTTPS를 사용하려는 경우 조금 더 안전합니다. 그렇지 않다면 엄청나게 위험하므로 경고없이 제안하는 것은 무책임합니다. 웹 서버가 최상위 도메인 (example.com)의 요청에이 헤더로 응답한다고 가정 해 보겠습니다. 그러면 https (예 : intranet.example.com)가 아닌 http를 통해서만 다른 웹 서버에서 제공하는 다른 하위 도메인을 하위 도메인에 포함시킵니다. , 작동 안 할 것이다. 사전로드 태그를 포함하면이를 사전로드 목록에 제출할 수 있으므로 웹 브라우저에 하드 코딩 된 다음 되돌릴 수 없습니다.
Barry Pollard

몇 년이 지났으므로 귀하의 스 니펫이 오늘날까지 여전히 유효하다는 점을 말씀 드리고자합니다.
KGIII

6

이것을 사용하고 https://hstspreload.org 를 준수하기 위해 htaccess 파일에 넣을 수 있습니다 . .htaccess 파일에 넣으십시오.

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

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L,E=HTTPS:1]
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS

먼저 비 https를 https로 리디렉션합니다. www가 아닌 ​​https를 HSTS 헤더를 사용하여 www https로 리디렉션합니다.

( http://example.com -> https://example.com -> https://www.example.com -와 HSTS 헤더)

https://hstspreload.org 테스트 및 준수


4

위해 httpd.conf(당신이 편집이을에 대한 액세스 권한이있는 경우) 당신은 사용할 수 있습니다

<VirtualHost 65.81.122.43:443>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains;"
</VirtualHost>

참고 : HTTPS 가상 호스트에서만 설정해야하며 http 가상 호스트에는있을 수 없습니다.

.htaccess 파일은 언제 사용해야하며 사용하지 않아야합니까?

.htaccess 파일을 허용하면 Apache가 서버에 액세스 할 때마다 해당 파일을 찾습니다. 상위 디렉토리도 검색되기 때문에 약간의 시간이 걸리며 서버 성능에 영향을 미칠 수 있습니다. 출처


Apache는 항상 .htaccess 파일을 찾습니다. 따라서 .htaccess 조회를 비활성화하지 않으면 Apache가 파일을 확인하므로 성능이 향상되지 않습니다.
Rudy Broersma

1

또 다른 대안은 항상 헤더를 설정하고 비 SSL 연결에 대해 조건부로 제거하는 것입니다.

Header always set   Strict-Transport-Security "max-age=31536000" early
Header        unset Strict-Transport-Security env=!HTTPS

이것은 Header지시문이 env조건과 early플래그 모두와 함께 사용될 수 있다는 장점이 있습니다 . 하나와 Header지시어 envearly함께 사용할 수 없습니다, 그들은 (공식 문서를 참조 상호 배타적 https://httpd.apache.org/docs/current/mod/mod_headers.html#header을 ).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.