Chung htaccess chuyển hướng www sang không www


484

Tôi muốn chuyển hướng www.example.comđến example.com. Mã htaccess sau đây thực hiện điều này:

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

Nhưng, có cách nào để làm điều này theo cách chung chung mà không cần mã hóa tên miền không?


64
Điều quan trọng cần lưu ý là nếu bạn không sử dụng www (hoặc một số tên miền phụ khác) thì tất cả cookie sẽ được gửi đến mọi tên miền phụ, bạn sẽ không thể có tên miền phụ không có cookie để phục vụ nội dung tĩnh do đó làm giảm lượng dữ liệu được gửi qua lại giữa trình duyệt và máy chủ. Một cái gì đó mà sau này bạn có thể phải hối hận: twitter.com/codinghorror/statuses/1637428313
Sam Hasler

3
Một điều khác cần xem xét, đảm bảo bạn đang đặt tên chính tắc mà không có www trong các trang của mình, để tránh bị phạt nội dung trùng lặp. Ngoài ra nếu bạn có các url tuyệt đối trong các liên kết của mình, hãy đảm bảo rằng tất cả chúng đều không có www.
Jeremy Morgan

Trong tâm trí của tôi nó tốt hơn để giữ cho chuyển hướng rõ ràng, đặc biệt là khi sao chép cấu hình cho tên miền khác, mà có thể yêu cầu điều chỉnh khác nhau (miền www là tốt hơn trong một số trường hợp) weboptimizer.ch/2014/01/redirection-www
bông tuyết

Bất kỳ lý do tại sao giải pháp này sẽ làm việc cho tất cả các trường hợp ngoại trừ url gốc? Ví dụ: domain.com không chuyển sang domain.com , trong khi domain.com/page1 chuyển hướng đến domain.com/page1 .
Jeff Solomon

Nếu bạn muốn chuyển hướng www sang không phải www trong khi duy trì giao thức (HTTP hoặc HTTPS) thì hãy xem câu hỏi liên quan này: Chuyển hướng www sang không www trong khi duy trì giao thức HTTP hoặc HTTPS
MrWhite

Câu trả lời:


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

Giống như Michael ngoại trừ cái này hoạt động: P


16
Nếu nó không hoạt động, có lẽ bạn đang thiếu RewriteEngine Ontiền thân để làm cho nó hoạt động.
hendry

8
@Ben, làm thế nào tôi sử dụng ngược lại, để thêm www vào một trang web không có www?
anarkhos

18
Nó chuyển hướng http://www.domain.com/đến http://domain.com//. Bạn nên thêm /vào RewruteRule. Điều này làm việc cho tôi RewriteRule ^/(.*)$ http://%1/$1 [R=301,L].
Vladimir Prudnikov

13
Tôi đã gặp vấn đề tương tự như Vladimir khi nó chuyển hướng đến http://domain.com//với dấu gạch chéo kép. Vì vậy, tôi đã làm RewriteRule ^(.*)$ http://%1$1 [R=301,L] và dường như nó đang hoạt động cho đến nay
bobfet1

5
Vui lòng sử dụng giải pháp sau thay vì viết lại công cụ, nó nhanh hơn nhiều trong khi thanh lịch: stackoverflow.com/questions/1100343/ chủ
Birla

111

Nhưng nếu chúng ta cần làm điều này cho http và https riêng biệt:

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/ chuyển hướng đến example.com// Có cách nào để xóa dấu gạch chéo thừa không?
Bobby S

Câu hỏi hay. Tôi đoán giải pháp nhanh chóng sẽ là sử dụng các quy tắc bổ sung (nghĩa là chỉ trong trường hợp này) trước khi được mô tả ở trên. Ví dụ: RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L] ...
Andron

3
@BulkS Tôi đã sử dụng giải pháp trong bài viết này . Nó chuyển hướng www và HTTP sang HTTPS không www và cũng xử lý theo dõi /.
totymedli

Bạn sẽ chỉ nhận được một dấu gạch chéo (ở đầu đường dẫn URL), nếu bạn đặt các lệnh này trực tiếp trong cấu hình máy chủ (hoặc virtualhost). Trong .htaccessbạn không nên nhận thêm một dấu gạch chéo. (Chỉ cần lưu ý, nếu bạn đang thực hiện chuyển hướng này trong cấu hình máy chủ thì có lẽ bạn không nên sử dụng mod_rewrite để bắt đầu với ... một mod_alias đơn giản Redirecttrong bộ chứa vhost thích hợp sẽ hiệu quả hơn và ít bị lỗi hơn.)
MrWhite

72

Chuyển hướng không www sang www (cả hai: 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 Điều này là do giải pháp của tôi cho chuyển hướng ngược (từ không phải www sang www) trái ngược với Andron
Dmitriy

2
Lưu ý: giải pháp này có thể gây ra một số vấn đề nếu bạn có ý định sử dụng tên miền phụ cho các mục đích khác. Ví dụ: app.yourdomain.com sẽ được chuyển hướng đến www.app.yourdomain.com.
Marty ZHANG

1
Điều này hoàn toàn ngược lại với một câu trả lời cho câu hỏi.
Giăng

Tôi đã phải thêm RewriteEngine OnRewriteBase /, nhưng nếu không thì làm việc tốt.
lật đổ


33

Dưới đây là các quy tắc để chuyển hướng URL www sang no-www:

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

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

Dưới đây là các quy tắc để chuyển hướng URL không có www sang www:

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

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

Lưu ý rằng tôi đã sử dụng NEcờ để ngăn apache thoát khỏi chuỗi truy vấn. Không có cờ này, apache sẽ thay đổi URL được yêu cầu http://www.example.com/?foo%20barthànhhttp://www.example.com/?foo%2250bar


1
bạn có thể viết mã để chuyển hướng http sang https cùng với chuyển hướng www sang không www
HYDER ALI

Thay đổi http: // thành https: // để buộc nó thành HTTPS khi thay đổi. Bạn cũng sẽ muốn thêm một chuyển hướng http-> https thông thường cho lưu lượng truy cập không được chuyển hướng bởi các quy tắc này.
diamondsea

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

Các RewriteCondảnh chụp tất cả mọi thứ trong HTTP_HOSTbiến sau sự www.và lưu nó trong %1.

Việc RewriteRulenắm bắt URL mà không cần dẫn đầu /và lưu nó vào $1.


1
sans leading "/"- Trong .htaccess(như đã nêu trong câu hỏi) không có dẫn đầu /, do đó mô hình không bao giờ khớp và chuyển hướng không bao giờ xảy ra. (Chỉ có một dấu gạch chéo hàng đầu trong ngữ cảnh máy chủ hoặc virtualhost .) Ngoài ra, nếu bạn có bất kỳ chỉ thị mod_rewrite nào sau này thì bạn sẽ cần Lcờ.
MrWhite

7

Thử cái này:

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

Nếu máy chủ bắt đầu bằng www, chúng tôi sẽ dán toàn bộ máy chủ vào đầu URL, sau đó tắt "www."


1
RoBorg, thật không may, cài đặt của bạn không hoạt động, nếu tôi thử điều này: example.com/hello/world Tôi kết thúc tại đây: example.com/hello/world/world Tôi cũng phải thêm một dấu gạch chéo sau% {HTTP_POST} trong RewriteRule đầu tiên
deepwell

2
Tôi đang sử dụng Apache / 2.2.9 (Unix). Nó hoạt động cho www.website, chuyển hướng đến trang web Nhưng đối với các mục sau: website / test -> đi tới: websitetest Tôi đã sửa lỗi này bằng cách thêm một lỗi khác / Lỗi thứ hai: website / test / n vào websitetest / n / n
deepwell

1
Vấn đề tương tự như @deepwell với cái này.
neemzy

Các vấn đề mà người đọc trước đó đang gặp phải là do các chỉ thị này dành cho cấu hình máy chủ (hoặc vhost) chứ không phải .htaccess. Trong ngữ cảnh thư mục ( .htaccess), bạn nên thay đổi đầu tiên RewriteRuleđể đọc: RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [C,DPI](yêu cầu Apache 2.2.12+). Lưu ý việc thêm dấu gạch chéo và DPIcờ (Hủy thông tin đường dẫn) - để ngăn một phần của đường dẫn URL dường như bị trùng lặp (thực tế là "thông tin đường dẫn") như đã nêu trong các nhận xét trước đó. Tuy nhiên, có những chỉ thị đơn giản hơn - như được đề cập trong các câu trả lời khác.
MrWhite

7

Hoàn thành trình xử lý WWW chung, http / https

Tôi đã không thấy một câu trả lời hoàn chỉnh. Tôi sử dụng điều này để xử lý sự bao gồm WWW.

  1. Chung. Không yêu cầu thông tin tên miền.
  2. Buộc WWW trên tên miền chính: www.domain.com
  3. Xóa WWW trên tên miền phụ: sub.domain.com
  4. Duy trì trạng thái HTTP / HTTPS.
  5. Cho phép cookie riêng cho tên miền / tên miền phụ

Xin vui lòng cho tôi biết làm thế nào điều này hoạt động hoặc nếu tôi để lại một lỗ hổng.

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]

Câu hỏi ban đầu yêu cầu chuyển hướng wwwđến không www. Bạn đang buộc phải đưa vào www.
Vadim

6

Có thể có rất nhiều thông tin sai lệch về chuyển hướng htaccess, tôi thấy. Trước hết, hãy đảm bảo trang web của bạn đang chạy trên Unix bằng Apache chứ không phải trên máy chủ Windows nếu bạn muốn mã này hoạt động.

RewriteEngine On

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

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

(Tuy nhiên, hãy đảm bảo không có khoảng trắng dòng giữa mỗi dòng văn bản; Tôi đã thêm một khoảng trắng giữa các dòng để nó hiển thị ổn trong cửa sổ này.)

Đây là một đoạn mã có thể được sử dụng để hướng phiên bản www của trang web của bạn sang phiên bản http: //. Có những mã tương tự khác cũng có thể được sử dụng.


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

Đối với thư mục con


3

Đối với những người cần có thể truy cập toàn bộ trang web mà KHÔNG CÓ tiền tố 'www'.

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

Mare chắc chắn bạn thêm nó vào tập tin sau

/site/location/.htaccess 

Ví dụ này không đầy đủ - bạn không đặt protosslbiến môi trường (đây không phải là biến tiêu chuẩn / máy chủ). Điều này sẽ luôn trống, vì vậy sẽ luôn luôn chuyển hướng đến http. (Ý tưởng đằng sau việc thiết protossltrước đó trong mã là khi bạn muốn giữ các giao thức khi chuyển hướng Tuy nhiên, những ngày này có lẽ bạn nên được chuyển hướng đến. httpsTất cả các thời gian.)
MrWhite

3

Sử dụng .htaccess để chuyển hướng đến www hoặc không www:

Chỉ cần đặt các dòng mã sau vào tệp chính, gốc .htaccess của bạn. Trong cả hai trường hợp, chỉ cần thay đổi domain.com thành tên máy chủ của riêng bạn.

Chuyển hướng đến www

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

Chuyển hướng đến không www

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

thay đổi DOT thành =>. !!!


2

Tôi đã sử dụng quy tắc trên để fwd www thành không www và nó hoạt động tốt cho trang chủ, tuy nhiên trên các trang nội bộ họ đang chuyển tiếp đến /index.php

Tôi đã tìm thấy quy tắc khác này trong tệp .htaccess của mình gây ra điều này nhưng không biết phải làm gì với nó. Bất kỳ đề xuất nào cũng sẽ rất tuyệt:

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

Bạn cần đặt các quy tắc chuyển hướng không phải www trước những quy tắc bạn đã trích dẫn.
Vladimir Jovanović

2

www đến không www với https

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]

Nếu bạn muốn loại bỏ wwwtrên cả hai httphttps, sử dụng như sau:

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

Điều này chuyển hướng Non ssl

đến

Và SSL

đến

trên apache 2.4.*bạn có thể thực hiện điều này bằng cách sử dụng Redirectvới ifchỉ thị,

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

2

sử dụng: Javascript / 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";

Hoặc .htaccess:

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

và Phương thức 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

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

Cách duy nhất tôi làm cho nó hoạt động ...

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

1

Nếu bạn đang buộc www. trong url hoặc buộc ssl prototcol, sau đó thử sử dụng các biến thể có thể có trong tệp htaccess, chẳng hạn như:

RewriteEngine On
RewriteBase /

### Buộc WWW ###

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

## Buộc SSL ###

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

## Chặn IP ###
Từ chối đặt hàng, cho phép
Từ chối từ 256.251.0.139
Từ chối từ 199.127.0.259

Apache có thể nghe một cổng khác, ví dụ 81. Vì vậy, thay vì RewriteCond %{SERVER_PORT} 80tôi đề nghị sử dụng kiểm tra phổ quát hơn như vậy:RewriteCond %{HTTPS} off
Andron

1

Câu trả lời được chọn và nhiều giải pháp khác ở đây đã bỏ phần url sau /, vì vậy về cơ bản, nó luôn được chuyển hướng đến tên miền chính, ít nhất là đối với tôi .. Vì vậy, tôi đang thêm mẫu làm việc tôn trọng đường dẫn đầy đủ sau dấu gạch chéo ..

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

1

Cách tiếp cận khác nếu tùy chỉnh .htaccess không phải là lựa chọn lý tưởng:

Tôi đã tạo máy chủ chuyển hướng đơn giản để sử dụng công cộng. Chỉ cần thêm bản ghi A hoặc CNAME:

CNAME   r.simpleredirect.net
A       89.221.218.22

Thông tin thêm: https://simpleredirect.net


0

Tôi không chắc tại sao bạn muốn xóa www. Nhưng phiên bản ngược lại sẽ là:

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

Và lợi thế của tập lệnh này là: nếu bạn có một cái gì đó như test.whattimein.com hoặc bất kỳ thứ gì khác (môi trường để phát triển / thử nghiệm) thì nó sẽ không chuyển hướng U đến môi trường ban đầu.


2
Có nên đưa tên miền phụ www vào hay không thực sự là vấn đề sở thích cá nhân và có thể phụ thuộc vào tên miền và đối tượng mục tiêu. Mã chung được đăng ở trên để chuyển hướng www sang none-www cũng xử lý các môi trường kiểm tra OK, vì chuyển hướng chỉ xảy ra khi "www." tên miền phụ được gặp.
MrWhite

1
Câu hỏi này ngược lại với những gì người dùng đang hỏi, điều này chỉ gây ô nhiễm bài đăng.
Vadim

0

Điều này được cập nhật để hoạt động trên Apache 2.4:

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

Thay đổi duy nhất so với Michael là loại bỏ [NC]lỗi tạo ra lỗi "AH00665":

Tùy chọn NoCase cho mẫu phi regex '-f' không được hỗ trợ và sẽ bị bỏ qua


Câu trả lời trước đó không cần "cập nhật để hoạt động trên Apache 2.4". "Cảnh báo" bạn đang trích dẫn (AH00665) liên quan đến một chỉ thị khác (ví dụ: nếu bạn có một cái gì đó như RewriteCond %{REQUEST_FILENAME} !-f [NC]). Các NClá cờ làm cho sự khác biệt nhỏ ở trên, tuy nhiên, lý do NCcờ nên được sử dụng ở đây là để nắm bắt những phần nhỏ của lưu lượng bot đó (không chính xác) sẽ gửi một hostname chữ hoa.
MrWhite

0

Đã thêm nếu localhost, bỏ qua chuyển hướng (cho mục đích phát triển trong môi trường cục bộ). Nếu không phải localhost VÀ (không phải https HOẶC www), hãy chuyển hướng đến https và không phải 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]

Vui lòng giải thích mã của bạn để OP hiểu cách trả lời câu hỏi này.
RyanNerd

-2

Xin chào, bạn có thể sử dụng các quy tắc sau trên tệp htaccess của mình:

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

Câu hỏi là yêu cầu một giải pháp "chung chung" không bao gồm tên miền. Giải pháp của bạn cũng hoàn toàn trái ngược với những gì được yêu cầu trong câu hỏi (không phải www đến www, thay vì www thành không www) mà không cần giải thích.
MrWhite
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.