htaccess는 https : // www로 리디렉션


309

다음 htaccess 코드가 있습니다.

<IfModule mod_rewrite.c>

RewriteEngine On
RewriteCond !{HTTPS} off
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

</IfModule>

내 사이트를 https://www.HTTPS 로 리디렉션 하고 www.하위 도메인을 적용하고 싶지만 http://www.(HTTPS없이) 액세스 하면 HTTPS로 리디렉션되지 않습니다 https://www.


이어야한다RewriteCond %{HTTPS} =off
마이클 Berkowski에게

1
내가 그렇게하면 https : / / ww ww w w로
bigben December

친애하는 @bigben 당신은 여기에 잘못된 답변을 수락했습니다! 당신은 왜 내 대답에 문제가 있는지 알 수 있습니다 .
Amir Fo

답변:


632

먼저 HTTPS를 강제 실행하려면 올바른 환경 변수를 확인해야 %{HTTPS} off하지만, 위의 규칙 앞에 www.시행 할 두 번째 규칙이 www.있으므로 첫 번째 규칙에서 사용하지 마십시오.

RewriteEngine On
RewriteCond %{HTTPS} off
# First rewrite to HTTPS:
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Now, rewrite any request to the wrong domain to use www.
# [NC] is a case-insensitive match
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

프록시 정보

클라이언트가 HTTPS를 통해 프록시,로드 밸런서, 승객 응용 프로그램 등에 연결하는 일부 형태의 프록시 뒤에는 %{HTTPS}변수가 존재하지 않으며 on다시 쓰기 루프가 발생할 수 있습니다. 클라이언트와 프록시 /로드 밸런서가 HTTPS를 사용하더라도 애플리케이션이 실제로 일반 HTTP 트래픽을 수신하기 때문입니다. 이 경우 변수 X-Forwarded-Proto대신 헤더를 확인하십시오 %{HTTPS}. 이 답변은 적절한 과정을 보여줍니다


14
어떤 경우에는 인증서가 단일 도메인에만 적합 할 수 있습니다 (예 : www와 함께 작동하지만 예를 들어, 그렇지 않은 경우). 이러한 경우 먼저 올바른 도메인으로 리디렉션 한 다음 https로 리디렉션하십시오. 그렇지 않으면 브라우저에 인증서 오류 메시지가 표시됩니다.
Nick Benson

19
내가 사용하는 경우 RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]같은 URL을 exaple.com/?bla=%20가 되었다 exaple.com/?bla=%2520을 , 즉, 퍼센트 기호 인코딩되었습니다. 플래그 사용을 고려 NE이중 인코딩을 방지하기 위해 :RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]
비트

5
이것은 하나의 서버에서 리디렉션 루프를 제공하고 다른 서버에서 작동합니다. 난 정말 이유를 모르겠어요
user151496

4
@ user151496 장애가 발생한 서버는 니스 캐시를 통과하거나 승객에게 전달하는 것과 같은 HTTP 프록시를 사용합니까? 그렇다면 변수 X-Forwarded-Proto대신 HTTPS를 확인하기 위해 헤더를 확인 해야 할 수도 있습니다 %{HTTPS}. 어느 부분이 루프, www또는 HTTPS 부분을 ​​유발하는지 말하지 않았지만, 이것이 저에게 가장 먼저 떠오르는 부분입니다.
Michael Berkowski

5
엄밀히 말하면, 위의 두 규칙은 잘못된 순서입니다. 요청이 들어 오면 http://example.com(예 : HTTP 및 www가 아닌) 이중 리디렉션이 제공됩니다. 먼저 https://example.com(첫 번째 규칙)에 이어 https://www.example.com(두 번째 규칙)으로 이동하십시오. 두 규칙 모두 HTTPS에 관계없이 리디렉션되므로이 두 규칙을 반대로 바꾸면이 문제를 해결할 수 있습니다.
MrWhite

148

하나의 작은 수정으로도 Michals 답변이 저에게 효과적이었습니다.

문제:

당신은있을 때 하나의 사이트 보안 인증서 // WWW : 시도는 https를하지 않고 페이지에 액세스하는 것을 브라우저를. (또는 인증서가 포함 된 도메인) 안전하고 정확한 https 페이지로의 리디렉션을 받기 전에는 못생긴 빨간색 경고 화면이 표시 됩니다.

해결책

먼저 www로 리디렉션하거나 인증서가 적용되는 도메인을 리디렉션 한 다음 https 리디렉션 만 수행하십시오. 이렇게하면 브라우저에 현재 URL을 포함하지 않는 인증서가 표시되므로 사용자에게 오류가 발생하지 않습니다.

#First rewrite any request to the wrong domain to use the correct one (here www.)
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

#Now, rewrite to HTTPS:
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

5
+1이 시나리오에서는 더 나은 옵션이지만 클라이언트가 액세스 할 때 동일한 문제가 발생 https://example.com하지는 않지만 사용자가 입력 할 가능성이 가장 적은 형식이라고 생각합니다. (허용 된 답변에도 같은 문제가 있습니다)
Joshua Goossen

@ Larzan : 그 잘못입니다. 인증 예외는 2 개의 실제 리디렉션 을 수행하기 때문에 발생합니다 . "[L, R = 301]"을 "[R = 301]"으로 바꾸십시오. 그런 다음 규칙이 중단되지 않습니다. L = LAST
Defim

당신이 처리 할 필요가있는 경우 https://하지 않고 www단지에 인증서를하면서 www, 단순히 솔루션이 규칙을 추가합니다 : RewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTPS} on RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI}[L,R=301] 그것은 단순히로 돌아갑니다 http에 연결하려고 할 때 https://example.com인증서 오류를 방지 할 수 있습니다.
Eric Burel

1
요청시 이중 리디렉션 http://example.com(예 : HTTP 및 www 없음) 을 방지하기 위해 두 규칙을 어쨌든 (이전처럼) 되돌려 야합니다
MrWhite

@EricBurel이 경우 인증서 오류를 피할 수 없습니다. 코드가 실행되기 전에 SSL 핸드 셰이크가 발생합니다 (처음 SSL의 전체 지점). 브라우저 인증서 오류 전에 리디렉션을 실행할 수 있다면 요청이 이미 안전하지 않은 연결을 통해 이루어 졌음을 의미합니다. 이는 SSL 모델에서 근본적으로 실패합니다.
MrWhite

99

CloudFlare 또는 이와 유사한 CDN을 사용하는 경우 여기에 제공된 % {HTTPS} 솔루션에 무한 루프 오류가 발생합니다. CloudFlare 사용자 인 경우 다음을 사용해야합니다.

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

2
Cloudflare 지원 사이트의 현재 조언은 약간 다릅니다. support.cloudflare.com/hc/en-us/articles/…
ColinMcDermott

1
@ h0mayun에 동의하면 Cloudflare는 리디렉션 루프로 결과를 제공하지만이 코드는 완벽하게 작동합니다. 감사합니다!
hobailey

2
ec2에서 angularjs를 실행합니다. RewriteCond % {HTTPS}! = on을 사용하는 솔루션은 무한 리디렉션을 제공합니다 (이유는 확실하지 않습니다). X-Forwarded-Proto를 사용한이 솔루션은 트릭을 수행하는 것으로 보입니다. 감사합니다!
Mark Watkins

3
우리 환경에 맞게 수정 =http했습니다 !=https. X-Forwarded-Protohttp 인 경우 헤더가 선언되지 !=https않았 으므로 트릭 도 마찬가지입니다.
Johnathan Elmore

이 통찰력에 감사드립니다! 왜 {HTTPS}작동하지 않는지 알아 내려고 몇 시간을 보냈습니다 . 나는 {ENV:HTTPS}심지어 시도했지만 {SERVER_PORT} 443Cloudflare의 사용자 정의 HTTP 요청 헤더를 확인해야했기 때문입니다.
camslice

56

나쁜 해결책과 왜!

다음과 같은 코드를 사용할 때 아래 솔루션을 사용하지 마십시오.

RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.example.com%{REQUEST_URI} [L,R=301]

브라우저는 다음으로 이동합니다.

http://example.com

그런 다음 다음으로 리디렉션합니다.

https://example.com

그런 다음 다음으로 리디렉션합니다.

https://www.example.com

서버에 너무 많은 요청 입니다.

대부분의 대답 조차도이 문제가 있습니다.


최고의 솔루션과 답변

이 코드에는 [OR]URL의 이중 변경을 방지 하는 조건 이 있습니다 !

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) https://www.example.com%{REQUEST_URI} [R=301,L]

3
"나쁜 해결책과 왜!" -그 규칙은 잘못된 순서입니다. 이 두 규칙을 바꾸면 정확합니다. 두 가지가 아닌 하나의 리디렉션 만 받게됩니다.
MrWhite

4
예, 주어진 코드는 2 가지 리디렉션으로 나타납니다. 논쟁의 여지가 없습니다. 내가 말하는 것은이 문제를 해결하기 위해이 규칙을 간단히 바꾸면됩니다. 다른 변경은 필요하지 않습니다. ( "허용 된"답변은 실제로 부정확하다-이것은 당신이 말하는 것으로 보인다-지시어의 순서가 잘못되었다.)
MrWhite

1
yup @AmirForsati가 옳습니다. 두 번 리디렉션되며 이것이 허용되는 답변이어야합니다.
Zakir hussain

4
domainname 변수를 유지하려는 경우이를 사용할 수 있습니다.RewriteEngine On RewriteCond %{HTTPS} off 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]
I.devries

이것은 나를 리디렉션 wp-content/cache/page_enhanced/하고 있습니다. 이 문제를 어떻게 해결할 수 있습니까? 편집 :의 상단에 배치 해야하는 것 같습니다 .htaccess. 스크립트 주셔서 감사합니다 :)
Giacomo

35

이것이 프록시 사용자가 아닌 프록시에서 찾은 가장 좋은 방법입니다.

RewriteEngine On

### START WWW & HTTPS

# ensure www.
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

### END WWW & HTTPS

2
맞음 이것은 프록시 사용자가 아닌 가장 좋은 프록시 방법입니다. +1
Deep 3015

1
이것은 여러 301 리디렉션을 해결로, 최고의 하나입니다
Niraj 차우

1
최고의 솔루션.
SM Jobayer Alam

1
좋은 대답입니다. 이것은 나를 위해 일한 유일한 것입니다. Cloudflare 뒤에있는 경우 작동합니다 (Cloudflare에 페이지 규칙이 설정되어 있지는 않지만).
jasonco

모든 경우에 작동하는 유일한 솔루션입니다. 그러나 "www."를 모두 제거하고 제거하려면 어떻게해야합니까?
FedeKrum

27

거기에는 많은 해결책이 있습니다. 다음은이 문제를 직접 다루는 Apache 위키에 대한 링크입니다.

http://wiki.apache.org/httpd/RewriteHTTPToHTTPS

RewriteEngine On
# This will enable the Rewrite capabilities

RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS

RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e.  http://www.example.com/foo/ to https://www.example.com/foo/
# The leading slash is made optional so that this will work either in httpd.conf
# or .htaccess context

다시 쓰기 조건 RewriteCond %{HTTPS} offRewriteCond %{HTTPS} !=on해당 리디렉션 으로 변경하여 항상 발생한다는 것을 알았 습니다. 이것이 더 나은 대답 인 것 같습니다.
Samuel Hawksby-Robinson

이 솔루션은 정답으로 받아 들여 져야합니다! 나도 일 했어!
AndrewShmig

11

http : // 또는 https : //https : // www로 리디렉션하려면 모든 버전의 아파치에서 다음 규칙을 사용할 수 있습니다.

RewriteEngine on

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R]

아파치 2.4

RewriteEngine on

RewriteCond %{REQUEST_SCHEME} http [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R]

% {REQUEST_SCHEME} 변수는 apache 2.4 부터 사용할 수 있습니다 .


1
문제! : HTTP_HOST에 이미 www가 포함되어있는 경우. 그러나 scheme은 HTTPS가 아니며 www.www로 끝납니다. 호스트에서.
Jpsy

@Jpsy 당신이 맞아요. 리디렉션 대상을 업데이트했습니다. 입력 해 주셔서 감사합니다.
starkeen 2016 년

1
이것은 거의 내가 찾던 것이지만 다른 예제와 마찬가지로 도메인을 일반으로 유지하고 싶습니다. 가능합니까?
cronoklee

8

CloudFlare를 사용하는 경우 이와 같은 것을 사용해야합니다.

# BEGIN SSL Redirect
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
# END SSL Redirect

그러면 리디렉션 루프가 발생하지 않고 사이트가 SSL로 안전하게 리디렉션됩니다.

추신 : mod_rewrite.c를 확인하는 것이 좋습니다!


https : // theurlwithoutwww.com을 https : // www로 리디렉션하지 않습니다.
thesearentthedroids

이것은 실제로 "add www"지시문이있는 경우에만 실제로 작동하는 솔루션입니다. 다른 솔루션은 "다양한 리디렉션"을 제공합니다.
Daniel.P.


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

참고 : 다음 단계를 수행했는지 확인하십시오

  1. sudo a2enmod 다시 쓰기
  2. sudo 서비스 아파치 2 재시작
  3. /etc/apache2/sites-available/000-default.conf에있는 vhost 파일에 다음을 추가하십시오.
<Directory /var/www/html>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
  Require all granted
</Directory>

이제 .htaccess가 작동하고 사이트가 http : //에서 https : // www 로 리디렉션됩니다.



0

.htaccess 파일에 설정

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


-2

첫 번째 답변을 시도했지만 작동하지 않습니다 ...이 작품 :

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

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