문제

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] 

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

도움이 되었습니까?

해결책

다시 쓰기 엔진을 사용하는 것은이 문제를 해결하는 매우 헤비급 방법입니다. 더 간단한 솔루션은 다음과 같습니다.

<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 실제 서버 구성. Apache는 자동으로 모든 것을 보존합니다 / 사용할 때 Redirect 지령, 이 방법이 작동하지 않는 이유에 대한 일반적인 오해입니다 (실제로는 그렇습니다).

다른 팁

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]
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

제거 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.

    <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으로 리디렉션됩니다.

여기서 주문이 중요합니다. 두 번째 VirtualHost 지시문을 먼저 추가하면 리디렉션 루프가 발생합니다.

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

건배!

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

  • 도메인을 하드 코딩 할 필요가 없습니다 (여러 도메인 또는 환경간에 수용하는 vhost와 함께 작동)
  • 체계 (HTTP/HTTPS)를 보존하고 이전의 효과를 무시합니다. %{REQUEST_URI} 규칙.
  • 경로 부분은 이전의 영향을받지 않습니다 RewriteRuleS처럼 %{REQUEST_URI} 이다.

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

이것은 다음과 같습니다 HTTP_HOST 수신 URL의 도메인 이름 부분 만 포함하는 변수 (example.com). 도메인 이름에 a가 포함되어 있지 않다고 가정합니다 www. 도메인 이름을 정확하게 일치 시키면 다시 쓰레기가 작동합니다. 패턴 ^(.*)$ 모든 것을 일치시킬 것입니다 REQUEST_URI, HTTP 요청에서 요청한 리소스입니다 (foo/blah/index.html). 이것은 백색 참조에 저장 한 다음 새 도메인 이름으로 URL을 다시 작성하는 데 사용됩니다 (하나는 www).

[NC] 사례 감지 패턴 일치를 나타냅니다. [R=301] 코드 301을 사용하여 외부 리디렉션을 나타냅니다 (자원은 영구적으로 이동). [L] 모든 추가 재 작성을 중지하고 즉시 리디렉션됩니다.

나는 이것을 달렸다 ...

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

새 서버에서 25 개 이상의 도메인에 대해 보편적이어야 하므로이 지침은 내 virtual.conf 파일에 있습니다.u003CDirectory> 꼬리표. (Dir is all docroots의 부모입니다)

그래도 전체 Docroot가 패턴 매치에서 수행되면서 재 작성 규칙에 대해 약간의 해킹을해야했습니다. http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html 호스트와 포트 이후에만 물건이라고 말합니다.

비 WWW => www와 반대 WWW => 비 WWW에 대한 리디렉션 코드. .htaccess 파일의 하드 코딩 도메인 및 체계가 없습니다. 따라서 Origin 도메인 및 HTTP/HTTPS 버전이 보존됩니다.

Apache 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]

참고 : APACHE 2.2에서 작업하지 않으면 %{request_scheme}을 사용할 수 없습니다. 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]

... 더 짧은 버전은 %n이 마지막으로 재 작성에서만 사용할 수 있기 때문에 불가능합니다 ...

APACHE 2.4를 사용하는 경우 다시 작성 APACHE 모듈을 활성화 할 필요없이 다음과 같은 것을 사용할 수 있습니다.

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

도메인을 리디렉션하여 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]
  • 다른기구는 여전히 작동하고 있습니다.
  • 라인을 조정할 필요가 없습니다. 올바른 장소에 복사/붙여 넣기 만하면됩니다.

Vhost를 수정하면 Apache 변경 사항을 적용하는 것을 잊지 마십시오.

(기본 drupal7 .htaccess를 기준으로하지만 많은 경우에 작동해야합니다)

<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

이 시도:

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

이것은 간단합니다!

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

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

이 완벽한 작업을 확인하십시오

모든 사람이 사용하지 마십시오 Redirect permanent (또는 문제가 발생할 수있는 이유)

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

클라이언트가 등록되지 않은 하위 도메인을 사용한 경우 VirtualHost 그는 나중에 등록 되더라도이 하위 도메인에 도달하지 못할 수도 있습니다.

redirect permanent an을 보냅니다 HTTP 301 Moved Permanently 클라이언트 (브라우저)에게 많은 사람들 이이 응답을 계속 캐시합니다 (캐시가 수동으로 지워질 때까지). 따라서 해당 하위 도메인을 사용하면 서버를 다시 요청하지 않고 항상 www.

보다 브라우저는 HTTP 301S를 얼마나 오래 캐시합니까?

그냥 사용하십시오 Redirect

<VirtualHost *:80>
  ServerName example.com

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

Apache.org- Mod_rewrite를 사용하지 않을 때

apache.org- 표준 호스트 이름

나는 단지 같은 문제가 있습니다. 그러나 이것으로 해결되었습니다

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

이 규칙은 비 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-www-www--htaccess/

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

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

나는 외관 패턴을 사용합니다 (?!www.domain.com) 제외하기 위해 www 하위 도메인 모든 도메인을 다시 리디렉션 할 때 www 아파치에서 무한 리디렉션 루프를 피하기 위해 서브 도메인.

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

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

위의 두 솔루션을 사용하는 경우 <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

... 그리고 리디렉션이 발생하지 않거나 어떤 블록을 먼저 놓는 지에 따라 무한 리디렉션 루프가 있습니다.

WP 다중 사이트에서 비슷한 작업이 있었는데, 이는 리디렉션 규칙이 일반적이어야했습니다 (주어진 도메인의 경우 네트워크에 추가). 먼저 도메인에 와일드 카드를 추가했습니다 (주차 도메인). 참고. .com 이후.

CNAME * domain.com.

그런 다음 다중 사이트의 루트에있는 .htaccess 파일에 다음 줄을 추가했습니다. 나는 그것이 어떤 사이트에서도 효과가 있다고 생각합니다.

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

바라건대 이것은 도움이 될 것입니다.

추신. www에서 www로 리디렉션하려면 마지막 줄을

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

여러 vhost를 사용할 때 Serveralias를 사용하는 것이 더 쉽고 유용하다는 것을 알았습니다.

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

이것은 HTTPS Vhosts 와도 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top