![단일 .htaccess(랜딩 페이지)에서 여러 조건부 리디렉션을 모두 수행합니다.](https://rvso.com/image/770104/%EB%8B%A8%EC%9D%BC%20.htaccess(%EB%9E%9C%EB%94%A9%20%ED%8E%98%EC%9D%B4%EC%A7%80)%EC%97%90%EC%84%9C%20%EC%97%AC%EB%9F%AC%20%EC%A1%B0%EA%B1%B4%EB%B6%80%20%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98%EC%9D%84%20%EB%AA%A8%EB%91%90%20%EC%88%98%ED%96%89%ED%95%A9%EB%8B%88%EB%8B%A4..png)
단순히 "출시 예정" 단일 페이지 HTML이 있는 폴더가 있습니다.
그런 다음 필요에 따라 때때로 이 폴더를 가리키는 여러 도메인이 있습니다.
간단하죠?
제가 원하는 것은 원래 요청한 페이지가 www가 아닌 경우 www(301>)로 이동하고 https가 아닌 경우 https(301)로 이동한 다음 모든 트래픽을 https://www.originating-domain.xzy/index.html
(302) 로 리디렉션하는 조건입니다.
목적은 다목적 사용을 위한 랜딩 페이지가 되는 것이지만 항상 301부터 https://www
302까지입니다.index.html
나는 이미 각 사이트에서 www가 아닌 www와 http를 https로 작업하고 있습니다.
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
이제 302 임시 리디렉션을 index.html
.
아니면 이 작업을 완전히 수행하는 더 좋은 방법이 있습니까? 어쨌든 이건 모두 임시적인 것이기 때문에... 302 all Traffic to index 이것을 시도했지만 작동하지 않았습니다.
RewriteCond %{REQUEST_URI} !.*index\.html
RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]
답변1
RewriteCond %{REQUEST_URI} !.*index\.html RewriteRule https://www.%{HTTP_HOST}/index.html [R=302,L]
이것에는 몇 가지 문제가 있습니다 ...
당신은
RewriteRule
무늬(첫 번째 인수)가 완전히 일치하므로 이 지시문은 일치하지 않습니다.이것이 일치하면
www.
하위 도메인 앞에 접두어가 붙습니다.다시. 나는 당신이 이 리디렉션을 넣고 있다고 가정합니다.~ 후에표준 리디렉션(HTTP에서 HTTPS로, www가 아닌 www에서 www로) - 그래야 합니다. 따라서https://www.www.example.com/index.html
이 리디렉션이 트리거될 때 호스트 이름은 이미 표준이기 때문에 로 리디렉션됩니다.
그만큼상태( RewriteCond
지시문)은 실제로 필요하지 않습니다. 왜냐하면 이 검사( /index.html
아직 요청되지 않은)는 지시문 자체에 의해 더 효율적으로 처리될 수 있기 때문입니다 RewriteRule
.
예를 들어:
RewriteRule !^index\.html$ /index.html [R=302,L]
구성표+호스트 이름을 포함할 필요가 없습니다.치환어쨌든 동일한 문자열로 리디렉션하고 싶기 때문입니다. 명시적으로 표현하고 싶다면 https://%{HTTP_HOST}/index.html
.
현재로서는 index.html
다른 것을 참조할 수 없습니다.현지의리소스(이미지, CSS, JavaScript 등)도 리디렉션되기 때문입니다. 로컬 리소스에 대한 액세스를 허용하려면 정적 리소스에 대한 요청을 제외하는 몇 가지 조건을 추가해야 합니다.
RewriteCond %{REQUEST_URI} !.\.(jpg|png|webp|css|js)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.html$ /index.html [R=302,L]
또는 외부 도메인에서 이러한 리소스를 호스팅합니다. (또는 하위 디렉터리에서 전체 하위 디렉터리를 제외합니다.)
그러나 "리디렉션"을 선택하면 더 고유하고 의미 있는 이름의 파일로 리디렉션할 수 있습니다. /coming-soon.html
. 사용 시 문제 /index.html
는 나중에 해당 URL에 다른 콘텐츠를 제공하려고 하는데 (어떤 이유로든) 캐시된 경우입니다. 하지만 아마도 /coming-soon.html
"NOINDEX"여야 합니다.
그러나 전혀 리디렉션하지 않고 대신에일시적인"503 서비스를 사용할 수 없음" 응답. 보다내 대답이에 대한 자세한 내용은 웹마스터 스택에 대한 다음 질문을 참조하세요.
곁에:
RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
SSL 연결을 관리하는 프런트 엔드 프록시 뒤에 있습니까?
그렇다면 서버 변수를 확인하는 두 번째 조건은 불필요하지만 괜찮습니다 HTTPS
. 그러나 만약 당신이~ 아니다X-Forwarded-Proto: https
SSL 프록시 뒤에 있는 경우 헤더가 요청에 삽입 되면 이러한 지시문을 우회할 수 있습니다(즉, 사용자가 HTTPS로 리디렉션되지 않습니다) .
업데이트:
좋아요, 제가 원하는 대로 작동합니다. 하지만 어떤 방식으로든 결합할 수 있나요?
RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{REQUEST_URI} !.*coming-soon\.html [NC] RewriteRule ^(.*)$ https://%{HTTP_HOST}/coming-soon.html [R=302,L]
위에서 언급한 것처럼 마지막 규칙은 기본적으로 다음과 동일하며(이전의 표준 리디렉션과 함께 사용되는 경우) 더 간단하고 효율적입니다.
RewriteRule !^coming-soon\.html$ /coming-soon.html [R=302,L]
두 번째 규칙에서는 다음도 변경해야 합니다.RewriteRule
무늬from ^(.*)$
to ^
(첫 번째 규칙과 동일) ^(.*)$
불필요하게 역참조를 캡처하므로 효율성이 떨어집니다.
이전 댓글(지금은 삭제됨)에서 이것이 모든 하위 도메인에서도 작동하길 원한다고 언급하셨습니다. 모든 하위 도메인에 대해 "작동"하지만 항상 추가 하위 도메인 앞에 추가됩니다. www
이는 바람직할 수도 있고 그렇지 않을 수도 있습니다. ( www
하위 하위 도메인을 갖는 것은 일반적이지 않습니다.하위 도메인. YMMV.)
실제로 이러한 규칙을 "결합"할 필요는 없습니다. 302가 "곧 출시 예정" 페이지로 리디렉션되기 전에 301이 www+HTTPS로 리디렉션하려는 경우 이를 결합할 수 없습니다. 처음 두 규칙(301 리디렉션)은 단일 규칙으로 "결합"될 수 있지만 아무런 용도로 사용되지 않습니다.
여기서 유일한 사소한 문제는 잠재적으로 (최대) 2개의 리디렉션이 있다는 것입니다. 첫째, 원래 URL 경로의 www+HTTPS에 대한 301과 "곧 출시 예정" 페이지에 대한 두 번째 302입니다.
어쨌든 사용자를 리디렉션할 때 실제로 www+HTTPS로의 초기 301 리디렉션이 필요한지 궁금합니다.일시적인"곧"페이지. 새 사이트를 구현한 후("곧 출시 예정" 페이지 교체) 표준 리디렉션을 구현합니다. 302 리디렉션은 여전히 www+HTTPS로 리디렉션될 수 있습니다. (단, /coming-soon.html
직접 요청하는 경우가 있습니다 .)
예를 들어:
# 302 redirect to the coming soon page (www+HTTPS)
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$
RewriteRule !^coming-soon\.html$ https://www.%1/coming-soon.html [R=302,L]
# Edge case...
# The following two rules only apply if "/coming-soon.html" is requested directly
# and either non-www hostname and/or HTTP is requested
# in which case 301 redirect to the same on www+HTTPS
# www subdomain is missing...
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# HTTP + www has been requested
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
에 대한 모든 요청은 http://example.com/foo
302로 바로 리디렉션됩니다 https://www.example.com/coming-soon.html
.
요청해야 하는 경우 http://example.com/coming-soon.html
301로 리디렉션됩니다 https://www.example.com/coming-soon.html
(HTTPS 및 www 하위 도메인만 수정).
외부 리디렉션은 최대 1개만 있습니다.
답변2
좋아요, 제가 원하는 대로 작동합니다. 하지만 어떤 방식으로든 결합할 수 있나요?
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_URI} !.*coming-soon\.html [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/coming-soon.html [R=302,L]