
내 서버에서 301 리디렉션 체인의 양을 줄이려고 하므로 www가 아닌 리디렉션(하위 도메인이 있는 경우 제외)에 대한 하위 도메인과 인스턴스가 뒤에 있으므로 dev
HTTP에서 HTTPS로 리디렉션( 사용 ) 을 결합하고 싶습니다. %{HTTP:X-Forwarded-Proto}
로드 밸런서.
지금까지 내가 가지고 있는 내용은 다음과 같습니다 .htaccess
.
# move http to https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=301]
# Remove leading www
RewriteCond %{HTTP_HOST} ^www.example.net [NC]
RewriteRule ^(.*)$ https://example.net/$1 [R=301,L]
현재 구현에는 세 가지 문제가 있습니다.
요청에는
http://www.example.net
두 개의 리디렉션이 있습니다.이 사이트의 www를 www가 아닌 곳으로 리디렉션하는 대부분의 예와 마찬가지로 리디렉션되지 않으므로
ww.
내wwww.
분석에는 리디렉션되지 않은 잘못 입력된 하위 도메인이 많이 있습니다.개발 및 릴리스 준비에 사용하는 하위 도메인 과 그 형제를
dev.
리디렉션에서 제외하고 싶습니다 .http://dev.example.net
https
dev.
이걸 어떻게 조합해야 할까요?
답변1
1) 요청에는
http://www.example.net
두 번의 리디렉션이 있습니다.
이 문제는 두 규칙을 반대로 바꾸면 해결될 수 있습니다. 그런 다음 www.example.net
첫 번째 리디렉션에서 HTTPS로 리디렉션되므로 HTTP에서 HTTPS로의 리디렉션이 트리거될 필요가 없습니다.
(그러나 이는 구현하려는 의도가 없다고 가정합니다.HSTS- 이 경우 동일한 호스트 이름에서 HTTPS로 리디렉션한 이후 두 개의 리디렉션으로 유지해야 합니다.첫 번째요건입니다.)
2) 이 사이트의 www를 www가 아닌 곳으로 리디렉션하는 대부분의 예와 마찬가지로 리디렉션되지 않으므로
ww.
내wwww.
분석에는 리디렉션되지 않은 잘못 입력된 하위 도메인이 많이 있습니다.
ww.
일반적으로 또는 하위 도메인 에 대한 요청은 wwww.
해결되지 않으므로 이는 일반적으로 문제가 되지 않습니다. 이것이 작동하려면 다음을 구성해야 합니다.와일드카드DNS의 하위 도메인을 구성하고 이러한 요청을 수락하도록 서버를 구성했습니다.
^www\.
그러나 이는 정규식(스니펫)을 에서 로 수정하여 설명할 수 있습니다 ^w{2,4}\.
.
3) 개발 및 릴리스 준비에 사용하는 하위 도메인 과 그 형제를
dev.
리디렉션에서 제외하고 싶습니다 .http://dev.example.net
https
dev.
이는 HTTP-HTTPS 규칙에만 적용되므로 여기에 시작하는 호스트 이름을 제외하기 위해 추가 조건을 적용할 수 있습니다 dev.
.
위의 사항을 종합하여 다음을 시도해 보세요.
# Remove leading ww, www or wwww (and redirect to HTTPS)
RewriteCond %{HTTP_HOST} ^w{2,4}\.example\.net [NC]
RewriteRule (.*) https://example.net/$1 [R=301,L]
# Move http to https (except dev subdomain)
RewriteCond %{HTTP:Host} !^dev\. [NC]
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP:Host}%{REQUEST_URI} [R=301,L]
이것이 로드 밸런서의 요구 사항인 경우를 대비하여 HTTP 요청 헤더에 HTTP:Host
액세스하기 위해 동일한 사용을 유지했습니다 . Host
그렇지 않으면 여기에서 서버 변수를 사용하는 것이 더 일반적입니다 HTTP_HOST
.
접두사!
조건 패턴(즉. )은 정규 표현식을 부정하므로 다음 과 같은 !^dev\.
경우 조건이 성공합니다.Host
~ 아니다로 시작하세요 dev.
. ( www.dev.
아무것도 아닌 것 같은데 ?)
(.*)
^(.*)$
정규식은 기본적으로 욕심이 많기 때문에 동일합니다 .
테스트하기 전에 브라우저 캐시를 지워야 합니다. 캐싱 문제를 방지하려면 먼저 302(임시) 리디렉션으로 테스트하는 것이 좋습니다.
답변2
# Remove leading www, always using https regardless of the current URL scheme
RewriteCond %{HTTP_HOST} ^w{2,4}.example.net(?::|$) [NC,NV]
RewriteRule .* https://example.net%{REQUEST_URI} [L,R=301]
# move http to https, except for dev.example.net
RewriteCond %{HTTP:X-Forwarded-Proto} =http [NC,NV]
RewriteCond %{HTTP_HOST} !^dev.example.net(?::|$) [NC,NV]
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
NC
조건에 (nocase
) 플래그를 추가했습니다X-Forwarded-Proto
. 값이 대소문자를 구분하지 않는 것 같았기 때문입니다HTTP = Http = hTTp = http
. 즉 . 이것을 제거하는 것은 자유입니다.- 응답 헤더 에서 숨기기 위해 조건 에
NV
(novary
) 플래그를 추가했습니다 . 다시 말하지만, 특히 그렇지 않은 경우(역방향 프록시가 클라이언트에 보내기 전에 자동으로 필터링함) 또는 올바른 캐싱 동작에 필요한 경우(캐시는 콘텐츠 를 구별하지 않음 ) 자유롭게 제거할 수 있습니다.X-Forwarded-Proto
Vary
http
https
- 응답 헤더 에서 숨길 수 있도록 헤더 조건 에
NV
(novary
) 플래그를 추가했습니다 . 캐시 서버가 손상된 경우에도 이를 제거할 수 있습니다.Host
Vary
- 플래그 순서를 일관되게 만들었습니다
RewriteRule
(L,R=301
및R=301,L
본질적으로 동일함). www.example.net.but.not.actually.yours.com
인식되지는 않지만 여전히 허용됩니다www.example.net:443
.%{REQUEST_URI}
대체품으로 꾸준히 사용하세요 .- 또한 인식
ww
하고wwww
.