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} off을 RewriteCond %{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.