Apache VirtualHost 내에서 URL을 리디렉션 하시겠습니까?


61

Apache가있는 전용 서버가 있는데 VirtualHosts를 설정했습니다. www 도메인과 www가 아닌 ​​도메인을 처리하도록 하나를 설정했습니다.

www에 대한 내 VH .conf 파일 :

<VirtualHost *>
  DocumentRoot /var/www/site
  ServerName www.example.com
  <Directory "/var/www/site">
    allow from all
  </Directory>
</VirtualHost>

이것으로 .htaccess:

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

www를 www가 아닌 ​​버전으로 리디렉션하는 간단한 방법이 있습니까? 현재 두 버전을 모두 동일한 버전으로 보내고 DocumentRoot사용하고 .htaccess있지만 VirtualHost 파일에서이를 수행 할 수 있어야합니다.


답변:


105

mod_rewrite규칙과는 별도로 VirtualHosts 파일에서 규칙이 올바른 것으로 나타났습니다 RewriteBase. 나는 이것으로 끝났다.

<VirtualHost *>
  ServerName www.example.com
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www.example.com
  RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301]
</VirtualHost>

편집 : 의견에 joschi의 조언에 따라, 나는 이제 Redirect지시어를 사용 하여이 단순화 된 버전을 사용하고 있습니다 mod_alias:

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

2
이를 위해 mod_rewrite가 필요하지 않습니다. 대신 mod_alias 및 해당 RedirectPermanent 지시문을 사용하십시오.
joschi

@ joschi : 그것의 장점은 무엇입니까? 더 빠릅니까?
DisgruntledGoat

12
클라이언트를 리디렉션하기 위해 모든 검사와 가능성을 갖춘 완전한 다시 쓰기 엔진이 필요하지 않습니다. mod_alias가 mod_rewrite만큼 복잡하지 않으므로 mod_rewrite를 사용하여 두 개 대신 하나의 지시문 (RedirectPermanent) 만 필요하기 때문에 (마지막으로) 더 빠릅니다. 마지막으로 IMHO는 다른 사람이 처음으로 그것을 볼 때 구성에서 발생하는 일을 이해하는 것이 더 쉽습니다.
joschi

1
이상한 이유로 Redirect 301 ..은 우리에게 효과가 없었습니다. 우리는 RewriteRule 옵션을 사용해야했습니다.
so_mv

참고 : 제외, 윈도우 서버 2008 R2 엔터프라이즈에 WAMPSERVER 2.0 PHP 5.3.0을 사용 :80VirtualHost *원인 모든 "금지"돌아!
Cees Timmerman

4

기본적으로 301 리디렉션을받는 브라우저는이를 영구적으로 저장하므로 도메인에 액세스하려고 할 때 브라우저에서 볼 수있는 내용을 제어 할 수 없으므로 301 리디렉션에 매우주의해야합니다 www.example.com.

예를 들어이 토론을 참조 하십시오 http://getluky.net/2010/12/14/301-redirects-cannot-be-undon/

따라서 캐시되지 않았는지 확인하거나 mod_proxy를 사용하십시오 (mod_proxy를 권장합니다).

사용자에게 브라우저 주소 표시 줄에 URL 변경 사항이 표시되도록하려면 mod_rewrite를 사용하십시오.

<VirtualHost *>
 ServerName www.example.com
 RewriteEngine on
 RewriteCond %{HTTP_HOST} ^www.example.com
 RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301,E=nocache:1]
## Set the response header if the "nocache" environment variable is set
## in the RewriteRule above.
 Header always set Cache-Control "no-store, no-cache, must-revalidate" env=nocache
## Set Expires too ...
 Header always set Expires "Thu, 01 Jan 1970 00:00:00 GMT" env=nocache
</VirtualHost>

"리디렉션"을 사용자에게 보이지 않게하려면 mod_proxy를 사용하십시오.

<VirtualHost *>
 ServerName www.example.com
 ProxyRequests Off
 <Proxy *>
 Order Deny,Allow
 Deny from all
 Allow from 203.0.113.67
 </Proxy>
 ProxyPass / http://example.com/
 ProxyPassReverse / http://example.com/
</VirtualHost>

mod_proxy는 잘못 구성되면 네트워크에 손상을 줄 수 있습니다.


5
301의 요점은 영구적 인 리디렉션이라는 것입니다. 비 영구 리디렉션을 원하는 경우 302 또는 307을 대신 사용해야합니다.
nickgrim

2

에 추가 ServerAlias example.com할 수 VirtualHost있지만 성능은 리디렉션과 다릅니다.

편집하다

리디렉션을 원하고 고급 기능이 필요하지 않으므로 사용 Redirect하면 충분합니다. 당신은 RedirectVirtualHost 지시어에 넣을 것 입니다.

클라이언트 측 솔루션은 meta refresh태그 를 사용하는 것 입니다.


좀 더 설명해 주시겠습니까? 이 방법 www.example.comexample.com사용하여 어떻게 리디렉션 합니까?
DisgruntledGoat

기본 가상 호스트에, 당신은 모두에 대한 항목이 ServerNameServerAlias. 하나는 example.com이고 다른 하나는 www.example.com입니다. 그런 다음 두 dns 항목 모두 동일한 가상 호스트에 지정된 문서에 액세스합니다.
Warner

별칭뿐만 아니라 리디렉션을 하고 싶습니다 .
DisgruntledGoat

그러면 joshchi의 추천이 좋은 접근 방법이 될 수 있습니다. 이 시점에서 머리카락이 갈라지는 것 같습니다.
Warner

1

SERVERNAME www.example.com에 대해 하나의 가상 호스트를 작성하고 servername example.com을 사용하여 다른 가상 호스트로 경로 재 지정할 수 있습니다.

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