
여러 도메인에 서버가 있는 하나의 응용 프로그램이 있습니다(각 도메인은 응용 프로그램의 모양을 사용자 지정합니다.
또한 위와 동일한 데이터를 표시하기 위해 여러 하위 도메인을 갖는 공통 도메인이 있습니다.
그래서 - www.apples.com
와 동일하게 나타납니다.apples.efruit.co.uk
및 - www.bananas.co.uk
와 동일하게 나타납니다.bananas.efruit.co.uk
등
이제 efruit.co.uk 도메인에 대한 와일드카드 SSL이 있으므로 htaccess 파일을 사용하여 모든 efruit.co.uk 요청에 https를 사용하도록 강제하고 싶습니다(아직 사용하지 않은 경우).
다른 모든 도메인에는 SSL이 없으므로 브라우저 경고를 피하기 위해 다시 htaccess 파일에서 http를 사용해야 합니다.
또한 누군가가 www.apples.efruit.co.uk를 입력하면 apples.efruit.co.uk로 다시 작성되도록 htaccess 파일을 사용하고 싶습니다(위의 https를 통해). 그러나 www. efruit.co.uk 도메인이 아니어도 괜찮습니다.
마지막으로, URL을 더 예쁘게 만들기 위한 codeigniter에 대한 표준적이고 잘 문서화된 재작성 규칙이 있습니다.
지금까지 내가 가진 것은 다음과 같습니다.
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{REQUEST_URI} !(health_check\.php)$
RewriteCond %{HTTP_HOST} ^(.*)\.efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
RewriteCond %{HTTP_HOST} !^(.*)\.efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
RewriteCond %{HTTP_HOST} ^www\.([^\.]*)\.efruit\.co\.uk$
RewriteRule (.*) https://%1.efruit.co.uk$1 [R,L]
# block hidden directories
RewriteRule "(^|/)\." - [F]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]
그래도 작동하는 것으로 보이는 유일한 부분은 efruit.co.uk 도메인이 https를 통해 제공되도록 강제하는 것입니다.
답변1
X-Forwarded-Proto
SSL 프록시(?) 뒤에 있는 것 같으므로 서버 변수 대신 요청 헤더를 사용합니다 HTTPS
.
RewriteCond %{REQUEST_URI} !(health_check\.php)$ RewriteCond %{HTTP_HOST} ^(.*)\.efruit\.co\.uk RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
이 비트가 "작동"한다고 명시하는 동안(" efruit.co.uk
도메인이 https를 통해 제공되도록 강제") 기본 기본 도메인을 리디렉션하지 않으며 요청에 있는 경우 www 하위 도메인도 유지합니다. 먼저 이 부분을 제거해야 합니다. 보조 리디렉션을 피하세요. 따라서 이러한 지시문의 순서를 변경해야 합니다.
또한 이를 역참조로 사용하려는 의도가 아닌 이상 캡처 그룹(예: 괄호로 묶인 하위 패턴)이 필요하지 않습니다.
다른 모든 도메인에는 SSL이 없으므로 브라우저 경고를 피하기 위해 다시 htaccess 파일에서 http를 사용해야 합니다.
.htaccess
이러한 다른 도메인에 대한 브라우저 경고를 피하기 위해 HTTPS에서 HTTP로 리디렉션을 실행할 수 없습니다. 이는 귀하가 제안한 것 같습니다. SSL 인증서가 유효하지 않기 때문에브라우저 경고발생하다~ 전에 .htaccess
실행됩니다. SSL 핸드셰이크는 요청 시작 시 발생합니다.
RewriteCond %{HTTP_HOST} !^(.*)\.efruit\.co\.uk RewriteCond %{HTTP:X-Forwarded-Proto} =https RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
따라서 사용자가 SSL 인증서 경고(그렇지 않아야 함)를 수락하지 않는 한 위의 내용은 실제로 브라우저에서 실행되지 않습니다.
RewriteCond %{HTTP_HOST} ^www\.([^\.]*)\.efruit\.co\.uk$ RewriteRule (.*) https://%1.efruit.co.uk$1 [R,L]
이 경우 역참조에 슬래시 접두사가 없기 .htaccess
때문에 문서 루트를 제외한 모든 항목에 대해 잘못된 리디렉션이 발생합니다 . $1
문서 루트의 경우에도 끝에 슬래시를 포함해야 합니다.치환(브라우저가 이 문제를 암시적으로 수정하더라도). 또한 REQUEST_URI
처음 두 규칙에서는 서버 변수를 사용했지만 여기서는 역참조를 사용한 이유가 궁금하십니까?
대신 다음과 같이 시도해 보세요.
# Prevent any fruther processing when requesting "health_check.php"
# CHECK: Absence of start of string anchor?
RewriteRule health_check\.php$ - [L]
# Remove www sub-subdomain (and redirect to HTTPS)
RewriteCond %{HTTP_HOST} ^www\.([^.]+)\.efruit\.co\.uk [NC]
RewriteRule .* https://%1.efruit.co.uk%{REQUEST_URI} [R,L]
# HTTP to HTTPS redirect for the "efruit.co.uk" domain (and subdomains)
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteCond %{HTTP_HOST} ^([^.]+\.)?efruit\.co\.uk [NC]
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
# HTTPS to HTTP redirect for none "efruit.co.uk" domains
# Note that the user will still have to click through any browser security warnings
RewriteCond %{HTTP_HOST} !(^|\.)efruit\.co\.uk
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R,L]
기타 참고사항:
- 문자 클래스 내에서 사용되는 경우 리터럴 점을 백슬래시로 이스케이프할 필요가 없습니다.
$
후행 점이 포함된 FQDN을 포착하기 위해 호스트 검사에서 문자열 앵커의 끝을 제거했습니다 .- 제대로 작동하는지 확인하고 나면 영구(301) 리디렉션을 변경하고 싶을 것입니다. 즉.
R
로 변경R=301
.