비 www에서 www로 아파치 리디렉션


206

www가 아닌 ​​웹 사이트를 www로 리디렉션하지 않는 웹 사이트가 있습니다.

내 Apache 구성은 다음과 같습니다.

RewriteEngine On
### re-direct to www
RewriteCond %{http_host} !^www.example.com [nc]
RewriteRule ^(.*)$ http://www.example.com/$1 [r=301,nc] 

내가 무엇을 놓치고 있습니까?


1
A의 .htaccess: 기반 솔루션 나는 직경의 질문에 제기 된 답변 제안 stackoverflow.com/a/5262044/367456
hakre

이것은 좋지만 URL에 슬래시를 추가하므로 달러 전에 슬래시를 잃어 버립니다.
wuxmedia

답변:


510

다시 쓰기 엔진을 사용하면이 문제를 해결할 수 있습니다. 더 간단한 해결책은 다음과 같습니다.

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    # real server configuration
</VirtualHost>

그런 다음 실제 서버 구성 <VirtualHost>ServerName www.example.com위한 다른 섹션이 있습니다. 아파치 지시어를/ 사용할 때 아파치는 자동으로 아무것도 보존 하지 않습니다.이 방법이 왜 작동하지 않는지에 대한 일반적인 오해입니다 (실제로 작동하는 경우).Redirect


20
SSL 가상 호스트가있는 사이트에서도 어떻게합니까?
Shabbyrobe

28
이 제안을 사용할 때 "example.com의 웹 페이지에서 리디렉션이 너무 많이 발생했습니다"라는 오류가 발생합니다. 다른 사람들에게이 문제가 있습니까?
Jonathan Berger

4
@BlackDivine : 다른 방향으로하는 것에 대한 마술은 없습니다. 샘플에서 어디에나 스왑 www.example하고 example표시하면됩니다.
Greg Hewgill

11
@JonathanBerger 리디렉션이 너무 많으면 파일을 제대로 구성하지 않았을 수 있습니다. 두 개의 VirtualHost가 있어야합니다. 하나는 위의 www가 아닌 ​​다른 하나는 실제 구성이있는 ServerName www.example.com입니다. 또한 www.example.com 구성 (mod_alias 및 mod_rewrite)에서도 리디렉션이 없는지 확인하십시오.
Savas Vedova

3
example.com과 같은 가상 호스트 서버의 Redirect 301 / http://example2.com/extra/경우 리디렉션 이 있지만 후행 슬래시가 누락 example.com/blah됩니다 example2.com/extrablah. 어떤 아이디어? (Apache 2.2.22)
Peter Howe

87

http://example.com/subdir/?lold=13666 => http://www.example.com/subdir/?lold=13666

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

3
매우 짧은 대답 ...하지만 요점 ... 이것이 위 또는 아래 투표인지 확실하지 않습니다
thecoshman

2
아, 깔끔합니다. 이것은 최상위 레벨의 서버 설정에 포함될 수 있으며 모든 가상 호스트에 적용됩니다!
thenickdude

안녕하세요 @ burzumko 어떻게 이것을 달성합니까, 이것은 www가없는 모든 사람에게 사실이지만 example.com/subdi1/ws/* www없이 통과 하자고 말 합니까?
black sensei

1
이 솔루션을 HTTPS 가상 호스트에도 사용했습니다. s세 번째 행에 http를 추가하십시오 .
rodrigoap

46
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

이것은 나를 위해 작동하지 않았다; 그것은 같은 사이트로 무한 재전송 루프를 일으켰습니다
dmiller309

1
@ dmiller309 : 당신이 포함 한 일이 있습니까 www.ServerAlias?
cherouvim

2
네 말이 맞아 우연히 www를 넣었 어 *를 사용하여 ServerAlias에서. 와일드 카드. VirtualHost 항목의 순서를 엉망으로 만들었으므로 *. 와일드 카드는 내가 생각하지 않을 때 일치 할 수있는 기회를 가졌습니다.
dmiller309

7
깨끗하고 경로를 유지하고 (답변 # 1과 달리) 다시 쓰기를 사용하지 않기 때문에 이것이 가장 좋은 대답입니다.
schieferstapel

30

웹 사이트 www에서 제거하려면 파일 URL에서이 코드를 사용 .htaccess하십시오.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1$1 [R=301,L]

www웹 사이트 URL에서이 코드를 사용 하려면.htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^YourSite.com$
RewriteRule ^(.*)$ http://www.yourSite.com/$1 [R=301]
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule ^(([^/]+/)*[^./]+)$ /$1.html [R=301,L]

어디 YourSite.com당신과 함께 교체해야합니다 URL.


여러 개의 도메인 이름을 가진 웹 사이트에서 작동하기 때문에 가장 좋은 대답은 <3
Clement Herreman

2
.html의 두 번째 부분은 무엇입니까 ??
Nathan H

6
제거 슬래시는 $ 1 일 이전에 이중 슬래시가없는합니다 (//) 후 리디렉션 =>한다 RewriteRule ^ (. *) $ yourSite.com $ (1) [R은 = 301]
케빈 후보에

22
    <VirtualHost *:80>
       DocumentRoot "what/ever/root/to/source"
       ServerName www.example.com

       <Directory "what/ever/root/to/source">
         Options FollowSymLinks MultiViews Includes ExecCGI
         AllowOverride All
         Order allow,deny
         allow from all
         <What Ever Rules You Need.>
      </Directory>

    </VirtualHost>

    <VirtualHost *:80>
      ServerName example.com
      ServerAlias *.example.com
      Redirect permanent / http://www.example.com/
    </VirtualHost>

이것은 위의 코드에서 발생합니다. 첫 번째 가상 호스트 블록은 요청이 www.example.com인지 확인하고 해당 디렉토리에서 웹 사이트를 실행합니다.

실패하면 두 번째 가상 호스트 섹션으로 이동합니다. 여기서 www.example.com 이외의 것은 www.example.com으로 리디렉션됩니다.

여기 순서가 중요합니다. 두 번째 가상 호스트 지시문을 먼저 추가하면 리디렉션 루프가 발생합니다.

이 솔루션은 모든 요청을 도메인, www.yourdomain.com으로 리디렉션합니다.

건배!


16

이것은 몇 가지 개선 사항이있는 다른 많은 제안과 유사합니다.

  • 도메인을 하드 코딩 할 필요가 없습니다 (여러 도메인을 수용하거나 환경간에 가상 호스트를 사용할 수 있음)
  • 체계를 유지하고 (http / https) 이전 %{REQUEST_URI}규칙 의 영향을 무시합니다 .
  • 이전 RewriteRule의 영향을받지 않는 경로 부분 %{REQUEST_URI}은 다음 과 같습니다 .

    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ %{REQUEST_SCHEME}://www.%{HTTP_HOST}/$1 [R=301,L]
    

4
거의 완벽합니다. % {HTTP_HOST} / $ 1이 아닌 % {HTTP_HOST} $ 1이어야합니다 (또는 슬래시가 두 배가 됨)
Michael Wyraz

@Michael Wyraz : 슬래시를 두 배로 늘리지 않습니까?!
not2savvy

10
RewriteCond %{HTTP_HOST} ^!example.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

이것은 HTTP_HOST들어오는 URL ( example.com) 의 도메인 이름 부분 만 포함 하는 변수로 시작합니다 . 도메인 이름에 a가없고 www.도메인 이름과 정확하게 일치 한다고 가정하면 RewriteRule이 작동합니다. 패턴 ^(.*)$REQUEST_URIHTTP 요청 ( foo/blah/index.html) 에서 요청 된 리소스 인의 모든 항목과 일치 합니다. 이를 역 참조에 저장 한 다음 새 도메인 이름으로 시작하는 URL을 다시 작성하는 데 사용됩니다 (www .

[NC]대 / 소문자를 구분하지 않는 패턴 일치를 [R=301]나타내며 코드 301 (자원이 영구적으로 이동 됨)을 사용하여 외부 리디렉션을 표시하고 [L]추가 재 작성을 모두 중지하고 즉시 리디렉션합니다.


6

비 www => www 및 반대 www => 비 www에 대한 리디렉션 코드 .htaccess 파일에 하드 코딩 도메인 및 체계가 없습니다. 따라서 원본 도메인과 http / https 버전이 유지됩니다.

아파치 2.4 이상

비 WWW => WWW :

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ %{REQUEST_SCHEME}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

WWW => 비 WWW :

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ %{REQUEST_SCHEME}://%1%{REQUEST_URI} [R=301,L]

참고 : % {REQUEST_SCHEME}을 사용할 수없는 Apache 2.2에서는 작동하지 않습니다. Apache 2.2와의 호환성을 위해 아래 코드를 사용하거나 % {REQUEST_SCHEME}를 고정 http / https로 바꾸십시오.


아파치 2.2 이상

비 WWW => WWW :

RewriteEngine On

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

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

... 또는 더 짧은 버전 ...

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|offs
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

WWW => 비 WWW :

RewriteEngine On

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]

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

... 최근 RewriteCond에서만 % N을 사용할 수 있으므로 더 짧은 버전을 사용할 수 없습니다 ...


아파치 2.4 설정이 문제를 해결했습니다. 정답입니다 .. !!
KimchiMan

5

나는 이것을 달렸다 ...

 RewriteEngine on
 RewriteCond %{HTTP_HOST} !^www.*$ [NC]
 RewriteRule ^/.+www\/(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

새 서버에서 25 개 이상의 도메인에 대해 범용이어야하므로이 지시문은 virtual.conf 파일의 <Directory> 태그에 있습니다. (dir은 모든 docroot의 부모입니다)

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html이 말한 내용에도 불구하고 전체 docroot가 패턴 일치를 통해 수행되었으므로 다시 쓰기 규칙에 대해 약간의 해킹을 수행해야했습니다 . 호스트와 포트 뒤에 만있는 것입니다.


5

Apache 2.4를 사용하는 경우, 다시 쓰기 아파치 모듈을 활성화 할 필요없이 다음과 같은 것을 사용할 수 있습니다.

# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>

1
과소 평가. 이를 사용하면 자동화 된 Let'sEncrypt 스크립트에 적합한 추가 호스트를 피할 수 있습니다.
Paul

또한 ANSIBLE을 사용하는 경우 이제 ANSIBLE 2.0부터 하나의 작업으로 파일에 블록을 쉽게 삽입 할 수 있습니다. 자세한 내용은 docs.ansible.com/ansible/2.5/modules/blockinfile_module.html
sys0dm1n

3

domain.tld를 www로 리디렉션하십시오.

Apache 지시문 또는 .htaccess 파일에 다음 행을 추가 할 수 있습니다.

RewriteEngine on    
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • 다른 도메인은 여전히 ​​작동하고 있습니다.
  • 선을 조정할 필요가 없습니다. 적절한 장소에 복사 / 붙여 넣기 만하면됩니다.

호스트를 수정하는 경우 아파치 변경 사항을 적용하는 것을 잊지 마십시오.

(기본 Drupal7 .htaccess를 기반으로하지만 대부분의 경우 작동해야 함)


3

이것은 간단합니다!

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

2
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

그러면 도메인 이름뿐만 아니라 내부 페이지도 리디렉션됩니다.

example.com/abcd.html                ==>     www.example.com/abcd.html
example.com/ab/cd.html?ef=gh    ==>    www.example.com/ab/cd.html?ef=gh


고마워 매우 도움이됩니다.
Anthony

2

이 시도:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example.com$ [NC]
RewriteRule ^(.*) http://www.example.com$1 [R=301]

2

항상 사용하지 마십시오 Redirect permanent(또는 향후 문제가 발생할 수있는 이유)

나중에 하위 도메인을 추가 할 가능성이있는 경우 사용하지 마십시오 redirect permanent .

클라이언트가 등록되지 않은 하위 도메인을 사용한 경우 VirtualHost나중에 등록 할 때도이 하위 도메인에 도달 할 수 없기 때문입니다.

redirect permanent 보낸다 HTTP 301 Moved Permanently를 클라이언트 (브라우저) 많은 캐시가이 응답을 영원히 캐시합니다 (캐시가 수동으로 지워질 때까지). 따라서 해당 하위 도메인을 사용하면 서버를 다시 요청하지 않고도 항상 www. ***로 자동 리디렉션됩니다.

브라우저가 HTTP 301을 얼마나 오래 캐시합니까?를 참조하십시오 .

그래서 그냥 사용하십시오 Redirect

<VirtualHost *:80>
  ServerName example.com

  Redirect / http://www.example.com/
</VirtualHost>

Apache.org-mod_rewrite를 사용하지 않는 경우

Apache.org-정식 호스트 이름


1

RewriteEngine On RewriteCond %{HTTP_HOST} ^yourdomain.com [NC] RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [L,R=301]

이 완벽한 작업을 확인


0

방금 같은 문제가 있습니다. 그러나 이것으로 해결

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

이 규칙은 www가 아닌 ​​www를 리디렉션합니다.

이 규칙은 www를 www가 아닌 ​​www로 리디렉션하는 것입니다.

RewriteEngine On RewriteCond %{HTTP_HOST} !^my-domain\.com$ [NC] RewriteRule ^(.*)$ http://my-domain.com/$1 [R=301,L]

http://dense13.com/blog/2008/02/27/redirecting-non-www-to-www-with-htaccess/ 에서 참조하십시오


0

이것은 나를 위해 작동합니다 :

RewriteCond %{HTTP_HOST} ^(?!www.domain.com).*$ [NC]
RewriteRule ^(.*)$  http://www.domain.com$1  [R=301,L]

Apache에서 무한 리다이렉션 루프를 피하기 위해 모든 도메인을 서브 도메인으로 리디렉션 할 때 미리보기 패턴 (?!www.domain.com)을 사용하여 www서브 도메인 을 제외시킵니다 www.


0

내가 사용하는 코드는 다음과 같습니다

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

0

-여러 도메인 이름을 호스팅하는 경우 (선택 사항)

모든 도메인 이름이 https를 사용하는 경우

-모든 도메인 이름이 www dot domainName을 사용하도록하려면

이것은 doble redirection을 피할 것이다 (http : // non www에서 http : // www로 https : // www로)

<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^(.*)$ https://www.%1$1 [R=301,L]
</VirtualHost>

<VirtualHost *:443>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>

리디렉션 코드 301을 가장 편리한 것으로 변경해야합니다.


-1

s <VirtualHost *:80>가 다른 두 블록 의 위의 솔루션을 사용하는 경우 ServerName...

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost *:80>
    ServerName www.example.com
</VirtualHost>

... 다음 설정해야합니다 NameVirtualHost On뿐만 아니라 .

이 작업을 수행하지 않으면 Apache는 다른 ServerNames를 사용 하여 블록을 구별 할 수 없으므로 다음 오류 메시지가 표시됩니다.

[warn] _default_ VirtualHost overlap on port 80, the first has precedence

... 리다이렉션이 발생하지 않거나 어떤 블록을 먼저 넣느냐에 따라 무한 리다이렉션 루프가 있습니다.


-1

WP Multisite에서 비슷한 작업을 수행했는데 리디렉션 규칙은 일반적이어야합니다 (네트워크에 추가 할 특정 도메인에 대해). 먼저 도메인 (파킹 된 도메인)에 와일드 카드를 추가하여 해결했습니다. 를 참고하십시오. .com 후

CNAME * domain.com.

그런 다음 멀티 사이트 루트의 .htaccess 파일에 다음 줄을 추가했습니다. 모든 사이트에서 작동한다고 생각합니다.

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

잘하면 이것이 도움이 될 것입니다.

추신. www가 아닌 ​​www를 www로 리디렉션하려면 마지막 줄을

RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]

-2

여러 가상 호스트를 사용할 때 ServerAlias를 사용하는 것이 더 쉽고 유용하다는 것을 알았습니다.

<VirtualHost x.x.x.x:80>
    ServerName www.example.com
    ServerAlias example.com
    ....
</VirtualHost>

이것은 https vhosts 와도 작동합니다.


또 다른 드라이브 바이 다운 보트. 설명에주의를 기울이십시오. 아, httpd의 강력한 신은 downvote를 설명하기 위해 귀찮게 할 수 없습니까?
Anthony

1
이를 통해 동일한 사이트를 호스팅하는 여러 도메인을 가질 수 있습니다. 상황과 기본 웹 서버가 실행중인 항목에 따라 쿠키가 전달되지 않는 문제, 사람들이 혼란스러워하는 검색 엔진 문제 (2 개의 다른 사이트로 표시됨)가 발생합니다.
Jeffrey Van Alstine
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.