비 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.