Apache는 하나를 제외한 모든 하위 도메인을 www가 아닌 ​​https로 다시 작성합니다.

Apache는 하나를 제외한 모든 하위 도메인을 www가 아닌 ​​https로 다시 작성합니다.

내 서버에서 301 리디렉션 체인의 양을 줄이려고 하므로 www가 아닌 ​​리디렉션(하위 도메인이 있는 경우 제외)에 대한 하위 도메인과 인스턴스가 뒤에 있으므로 devHTTP에서 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]

현재 구현에는 세 가지 문제가 있습니다.

  1. 요청에는 http://www.example.net두 개의 리디렉션이 있습니다.

  2. 이 사이트의 www를 www가 아닌 ​​곳으로 리디렉션하는 대부분의 예와 마찬가지로 리디렉션되지 않으므로 ww.wwww.분석에는 리디렉션되지 않은 잘못 입력된 하위 도메인이 많이 있습니다.

  3. 개발 및 릴리스 준비에 사용하는 하위 도메인 과 그 형제를 dev.리디렉션에서 제외하고 싶습니다 .http://dev.example.nethttpsdev.

이걸 어떻게 조합해야 할까요?

답변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.nethttpsdev.

이는 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]
  1. NC조건에 ( nocase) 플래그를 추가했습니다 X-Forwarded-Proto. 값이 대소문자를 구분하지 않는 것 같았기 때문입니다 HTTP = Http = hTTp = http. 즉 . 이것을 제거하는 것은 자유입니다.
  2. 응답 헤더 에서 숨기기 위해 조건 에 NV​​( novary) 플래그를 추가했습니다 . 다시 말하지만, 특히 그렇지 않은 경우(역방향 프록시가 클라이언트에 보내기 전에 자동으로 필터링함) 또는 올바른 캐싱 동작에 필요한 경우(캐시는 콘텐츠 를 구별하지 않음 ) 자유롭게 제거할 수 있습니다.X-Forwarded-ProtoVaryhttphttps
  3. 응답 헤더 에서 숨길 수 있도록 헤더 조건 에 NV( novary) 플래그를 추가했습니다 . 캐시 서버가 손상된 경우에도 이를 제거할 수 있습니다.HostVary
  4. 플래그 순서를 일관되게 만들었습니다 RewriteRule( L,R=301R=301,L본질적으로 동일함).
  5. www.example.net.but.not.actually.yours.com인식되지는 않지만 여전히 허용됩니다 www.example.net:443.
  6. %{REQUEST_URI}대체품으로 꾸준히 사용하세요 .
  7. 또한 인식 ww하고 wwww.

관련 정보