www가 아닌 ​​www로 일반 htaccess 리디렉션


484

로 리디렉션 www.example.com하고 싶습니다 example.com. 다음 htaccess 코드는이를 가능하게합니다.

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

그러나 도메인 이름을 하드 코딩하지 않고 일반적인 방식으로이를 수행 할 수있는 방법이 있습니까?


64
www (또는 다른 하위 도메인)를 사용하지 않으면 모든 쿠키가 모든 하위 도메인 amd에 제출되며 정적 콘텐츠를 제공하기 위해 쿠키가없는 하위 도메인을 가질 수 없으므로 브라우저와 서버간에주고받는 데이터의 양 나중에 후회하게 될 무언가 : twitter.com/codinghorror/statuses/1637428313
Sam Hasler

3
고려해야 할 또 다른 사항은 중복 콘텐츠 페널티가 발생하지 않도록 페이지에 www없이 정식 이름을 설정했는지 확인하십시오. 또한 링크에 절대 URL이 있으면 모두 www가 아닌지 확인하십시오.
Jeremy Morgan

내 생각에 명시 적 리디렉션을 유지하는 것이 좋습니다. 특히 다른 도메인의 구성을 복사 할 때 다른 튜닝이 필요할 수 있습니다 (www 도메인이 더 나은 경우가 있습니다) weboptimizer.ch/2014/01/redirection-www
snowflake

이 솔루션이 루트 URL을 제외한 모든 경우에 작동하는 이유는 무엇입니까? 예를 들어 domain.com 하지 않습니다 piont에 domain.com 반면, domain.com/page1 로 리디렉션을 수행 domain.com/page1 .
Jeff Solomon

프로토콜 (HTTP 또는 HTTPS)을 유지하면서 www를 비 www로 리디렉션
MrWhite

답변:


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

이 작품을 제외하고 는 Michael 과 같습니다 : P


16
작동하지 않는 경우 작동하도록 RewriteEngine On하기위한 선구자 가 없을 수 있습니다.
hendry

8
@Ben, www가 아닌 ​​웹 사이트에 www를 추가 하기 위해 어떻게 이것을 역으로 사용 합니까?
anarkhos

18
로 리디렉션 http://www.domain.com/됩니다 http://domain.com//. 에 추가 /해야합니다 RewruteRule. 이것은 나를 위해 작동합니다 RewriteRule ^/(.*)$ http://%1/$1 [R=301,L].
Vladimir Prudnikov

13
http://domain.com//이중 슬래시로 리디렉션하여 Vladimir와 동일한 문제가 발생했습니다 . 그래서 나는 그것을 RewriteRule ^(.*)$ http://%1$1 [R=301,L] 하고 지금까지 일하고있는 것 같습니다
bobfet1

5
엔진을 다시 작성하는 대신 다음 솔루션을 사용하십시오. 우아하면서도 훨씬 빠릅니다. stackoverflow.com/questions/1100343/…
Birla

111

그러나 별도의 http 및 https를 위해이 작업을 수행 해야하는 경우 :

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

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

2
www.example.com/은 example.com/으로 리디렉션합니다. 추가 슬래시를 제거하는 방법은 무엇입니까?
Bobby S

좋은 질문. 빠른 해결책은 위에서 설명한 것보다 추가 규칙을 사용하는 것입니다 (이 경우에만 해당). 예 : RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L] ...
Andron

3
@BobbyS 이 기사 에서 솔루션을 사용했습니다 . www와 HTTP를 www가 아닌 ​​HTTPS로 리디렉션하고 후행을 처리합니다 /.
totymedli

이러한 지정 문을 서버 구성 (또는 가상 호스트)에 직접 배치 한 경우 URL 경로 시작시 추가 슬래시 만 표시됩니다. 에서 .htaccess당신이 여분의 슬래시를 받고되어서는 안된다. (서버 설정에서이 리디렉션을 수행하는 경우 우선 mod_rewrite를 사용하지 않아야 Redirect합니다. 적절한 vhost 컨테이너 의 간단한 mod_alias 가 더 효율적이고 오류가 덜 발생합니다.)
MrWhite

72

www아닌 사이트www로 리디렉션 (http : https)

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

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

4
@nightcoder 이것은 Andron과 반대로 역 리디렉션에 대한 솔루션 (www가 아닌 ​​www에서 www로)
Dmitriy

2
참고 : 다른 목적으로 하위 도메인 이름을 사용하려는 경우이 솔루션에 일부 문제가 발생할 수 있습니다. 예를 들어 app.yourdomain.com은 www.app.yourdomain.com으로 리디렉션됩니다.
Marty ZHANG

1
이것은 질문에 대한 답변과 정반대입니다.
John

나는 추가했다 RewriteEngine OnRewriteBase /하지만, 그 잘했다.
overthink


33

www URL을 no-www로 리디렉션하는 규칙은 다음과 같습니다.

#########################
# redirect www to no-www
#########################

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

www가없는 URL을 www로 리디렉션하는 규칙은 다음과 같습니다.

#########################
# redirect no-www to www
#########################

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

NE아파치가 쿼리 문자열을 빠져 나오지 않도록 플래그를 사용했습니다 . 이 플래그가 없으면 Apache는 요청 된 URL http://www.example.com/?foo%20bar을 다음으로 변경합니다.http://www.example.com/?foo%2250bar


1
www를 www가 아닌 ​​www로 리디렉션하는 것과 함께 http를 https로 리디렉션하는 코드를 작성할 수 있습니까?
HYDER ALI

http : //를 https : //로 변경하여 변경시 HTTPS로 강제 변경하십시오. 또한 이러한 규칙으로 리디렉션되지 않는 트래픽에 대해 정기적 인 http-> https 리디렉션을 추가하려고합니다.
diamondsea

11
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ https://%1/$1 [R]

RewriteCond에서 캡처 된 모든 HTTP_HOST변수 www. 과에 저장%1 .

RewriteRule캡처 선도적없이 URL /과에 저장합니다 $1.


1
sans leading "/"- .htaccess(질문에 명시된 바와 같이) 선행이 없으므로 /패턴이 일치하지 않으며 리디렉션이 발생하지 않습니다. ( 서버 또는 가상 호스트 컨텍스트 에는 슬래시 만 있습니다 .) 또한 mod_rewrite 지시문이 있으면 L플래그 가 필요합니다 .
MrWhite

7

이 시도:

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

호스트가 www로 시작하면 전체 호스트를 URL의 시작 부분에 붙인 다음 "www"를 제거하십시오.


1
RoBorg, 불행히도 설정이 작동하지 않습니다. example.com/hello/world 여기에 있습니다. example.com/hello/world/world 또한 % {HTTP_POST} 뒤에 슬래시를 추가해야했습니다. 첫 RewriteRule
딥웰

2
Apache / 2.2.9 (Unix)를 사용하고 있습니다. 웹 사이트로 리디렉션되는 www.website에서 작동하지만 다음과 같은 경우 웹 사이트 / 테스트 -> 다음으로 이동 : websitetest 다른 / 두 번째 오류를 추가하여이를 수정했습니다. website / test / nwebsitetest / n / n으로 이동
deepwell

1
@deepwell과 동일한 문제입니다.
neemzy

이전 독자들이 겪고있는 문제는 이러한 지시문이 아닌 서버 구성 (또는 vhost)을위한 것이기 때문 .htaccess입니다. A의 디렉토리 컨텍스트 ( .htaccess) 첫 번째 변경해야 RewriteRule읽기 : RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [C,DPI](2.2.12+ 아파치 필요). 슬래시와 DPI(Discard Path Info) 플래그를 추가하여 URL 경로의 일부가 이전에 언급 된 것처럼 실제로 복제되지 않도록합니다 (실제로는 "path-info"임). 그러나 다른 답변에서 다루는 것처럼 더 간단한 지시문이 있습니다.
MrWhite

7

일반 WWW 처리기, http / https

나는 완전한 대답을 보지 못했습니다. WWW 포함을 처리하는 데 사용합니다.

  1. 일반적인. 도메인 정보가 필요하지 않습니다.
  2. 기본 도메인에서 WWW를 강제 실행 : www.domain.com
  3. subdomains.com의 하위 도메인에서 WWW를 제거합니다.
  4. HTTP / HTTPS 상태를 유지합니다.
  5. 도메인 / 하위 도메인에 대한 개별 쿠키를 허용합니다

이것이 어떻게 작동하는지 또는 허점을 떠난 경우 알려주십시오.

RewriteEngine On
RewriteBase /

# Force WWW. when no subdomain in host
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Remove WWW. when subdomain(s) in host     
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)(.+\.)(.+\.)(.+)$ [NC]
RewriteRule ^ %1%3%4%5%{REQUEST_URI} [R=301,L]

원래 질문은로 전환 www하도록 요청합니다 www. 의 포함을 강제하고 www있습니다.
Vadim

6

htaccess 리디렉션에 대해 많은 잘못된 정보가있을 수 있습니다. 먼저이 코드가 작동하려면 Windows 호스트가 아닌 Apache를 사용하여 사이트가 Unix에서 실행되고 있는지 확인하십시오.

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]

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

(그러나 각 텍스트 줄 사이에 줄 간격이 없는지 확인하십시오. 줄 사이에 공간을 추가하여이 창에서 제대로 표시되도록했습니다.)

이것은 www 버전의 사이트를 http : // 버전으로 보내는 데 사용할 수있는 코드 스 니펫입니다. 사용할 수있는 다른 유사한 코드도 있습니다.


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

하위 폴더


3

'www'접두사 없이 전체 사이트에 액세스해야하는 사용자

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

이것을 다음 파일에 추가하십시오.

/site/location/.htaccess 

이 예제는 완료되지 않았습니다. protossl환경 변수를 설정하지 않았습니다 (표준 / 서버 변수가 아님). 이것은 항상 비어 있으므로 항상로 리디렉션됩니다 http. ( protossl코드 앞부분의 설정에 대한 아이디어 는 리디렉션 할 때 프로토콜을 유지하려는 경우를위한 것입니다. 그러나 요즘 https에는 항상 항상 리디렉션해야합니다 .)
MrWhite

3

.htaccess를 사용하여 www 또는 www가 아닌 ​​사이트로 리디렉션 :

다음 루트 코드를 기본 루트 .htaccess 파일에 넣으십시오. 두 경우 모두 domain.com을 자신의 호스트 이름으로 변경하십시오.

www로 리디렉션

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^domain\.com [NC]
  RewriteRule ^(.*)$ http://wwwDOTdomainDOtcom/$1 [L,R=301]
</IfModule>

비 www로 리디렉션

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
  RewriteRule ^(.*)$ http://domainDOTcom/$1 [L,R=301]
</IfModule>

DOT를 =>로 변경하십시오. !!!


2

위의 규칙을 사용하여 www를 www가 아닌 ​​www로 fwd하고 홈페이지에서는 제대로 작동하지만 내부 페이지에서는 /index.php로 전달됩니다.

내 .htaccess 파일 에서이 다른 규칙을 발견했지만이 문제를 일으키는 원인은 무엇인지 확실하지 않습니다. 어떤 제안이라도 좋을 것입니다 :

############################################
## always send 404 on missing files in these folders

    RewriteCond %{REQUEST_URI} !^/(media|skin|js)/

############################################
## never rewrite for existing files, directories and links

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

############################################
## rewrite everything else to index.php

    RewriteRule .* index.php [L]

인용 한 규칙보다 www가 아닌 ​​리디렉션 규칙을 배치해야합니다.
블라디미르 조 바노비치

2

https가 아닌 www가 아닌 ​​www

RewriteEngine on

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

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

2
RewriteEngine on
# if host value starts with "www."
RewriteCond %{HTTP_HOST} ^www\.
# redirect the request to "non-www"
RewriteRule ^ http://example.com%{REQUEST_URI} [NE,L,R]

제거 할 경우, www모두 httphttps다음을 사용 :

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.
RewriteCond %{HTTPS}s ^on(s)|offs
RewriteRule ^ http%1://example.com%{REQUEST_URI} [NE,L,R]

이것은 비 SSL을 리디렉션

그리고 SSL

아파치 2.4.*에서 Redirectwith if지시문을 사용 하여이 작업을 수행 할 수 있습니다 .

<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>

2

사용 : 자바 스크립트 / jQuery

// similar behavior as an HTTP redirect
window.location.replace("http://www.stackoverflow.com");
// similar behavior as clicking on a link
window.location.href = "http://stackoverflow.com";

또는 .htaccess :

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

그리고 PHP 방법 :

$protocol = (@$_SERVER["HTTPS"]    == "on") ? "https://" : "http://";

if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') {
    header('Location: '.$protocol.'www.'.$_SERVER    ['HTTP_HOST'].'/'.$_SERVER['REQUEST_URI']);
    exit;
}

아약스

$.ajax({
    type: "POST",
    url: reqUrl,
    data: reqBody,
    dataType: "json",
    success: function(data, textStatus) {
        if (data.redirect) {
            // data.redirect contains the string URL to redirect to
            window.location.href = data.redirect;
        }
        else {
            // data.form contains the HTML for the replacement form
            $("#myform").replaceWith(data.form);
        }
    }
});

1

내가 일할 수있는 유일한 방법은 ...

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

1

당신이 www를 강요하는 경우. url 또는 ssl 프로토콜을 강제 실행하는 경우 다음과 같이 htaccess 파일에서 가능한 변형을 사용하십시오.

RewriteEngine 켜기
RewriteBase /

### Force WWW ###

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

## 강제 SSL ###

RewriteCond % {SERVER_PORT} 80 
RewriteRule ^ (. *) $ https://example.com/$1 [R, L]

## IP 차단 ###
주문 거부, 허용
256.251.0.139에서 거부
199.127.0.259에서 거부

의 아파치 그래서 그 대신 81 예, 다른 포트를들을 수 있습니다 RewriteCond %{SERVER_PORT} 80I는 더 보편적 인 검사를 사용하는 것이 좋습니다 :RewriteCond %{HTTPS} off
Andron

1

선택한 답변과 다른 많은 솔루션은 / 뒤에 URL의 일부를 삭제 했으므로 기본적으로 항상 적어도 기본 도메인으로 리디렉션됩니다. 따라서 슬래시 후 전체 경로를 고려한 작업 샘플을 추가하고 있습니다.

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

1

.htaccess 사용자 정의가 이상적인 옵션이 아닌 경우 대체 방법 :

공개 용도로 간단한 리디렉션 서버를 만들었습니다. A 또는 CNAME 레코드를 추가하십시오.

CNAME   r.simpleredirect.net
A       89.221.218.22

더 많은 정보 : https://simpleredirect.net


0

왜 www를 제거하고 싶은지 잘 모르겠습니다. 그러나 역 버전은 다음과 같습니다.

# non-www.* -> www.*, if subdomain exist, wont work
RewriteCond %{HTTP_HOST} ^whattimein\.com
RewriteRule ^(.*)$ http://www.whattimein.com/$1 [R=permanent,L]

그리고이 스크립트의 장점은 다음과 같습니다 : 만약 test.whattimein.com 또는 다른 (개발 / 테스트 환경)과 같은 것이 있다면 U를 원래 환경으로 리디렉션하지 않습니다.


2
www 하위 도메인의 포함 여부는 실제로 개인 취향의 문제이며 도메인 이름과 대상 독자에 따라 달라질 수 있습니다. www를 none-www로 리디렉션하기 위해 위에 게시 된 일반 코드도 테스트 환경을 처리합니다. 리디렉션은 "www"일 때만 발생하기 때문입니다. 하위 도메인이 발견되었습니다.
MrWhite

1
이 질문은 사용자가 요구하는 것과 반대이며 게시물을 오염시킵니다.
Vadim

0

이것은 Apache 2.4에서 작동하도록 업데이트되었습니다.

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

Michael과의 유일한 변경 은을 제거하는 것입니다 [NC]. "AH00665"오류가 발생합니다.

비정규 패턴 '-f'에 대한 NoCase 옵션은 지원되지 않으며 무시됩니다.


이전 답변은 "Apache 2.4에서 작동하도록 업데이트"가 필요하지 않았습니다. 인용하는 "경고"(AH00665)는 다른 지시어와 관련이 있습니다 (예 :와 같은 것이있는 경우 RewriteCond %{REQUEST_FILENAME} !-f [NC]). NC플래그는 상기 그러나 이유 차가 적은 수 NC플래그 한다 여기에서 사용이 (잘못) 대문자 호스트를 보내는 봇 트래픽의 작은 부분을 잡는 것이다.
MrWhite

0

로컬 호스트 인 경우 추가됨 (지역 환경의 개발 목적으로) 리디렉션을 무시하십시오. localhost AND가 아닌 경우 (https 또는 www가 아닌) https 및 www가 아닌 ​​www로 리디렉션하십시오.

RewriteEngine On

RewriteBase /
RewriteCond %{HTTP_HOST} !localhost [NC]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

OP가 이것이 질문에 어떻게 대답하는지 이해하도록 코드를 정교하게 작성하십시오.
RyanNerd

-2

안녕하세요 htaccess 파일에서 다음 규칙을 사용할 수 있습니다.

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

문제는 도메인 이름을 포함하지 않는 "일반적인"솔루션을 요구하는 것입니다. 귀하의 솔루션은 또한 설명없이 질문에서 요구되는 내용 (www가 아닌 ​​www가 아닌 ​​www가 아닌 ​​www가 아닌 ​​www가 아닌) 과 완전히 반대 입니다.
MrWhite
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.