chuyển hướng apache từ không www sang www


206

Tôi có một trang web dường như không chuyển hướng từ không www sang www.

Cấu hình Apache của tôi như sau:

RewriteEngine On
### re-direct to www
RewriteCond %{http_host} !^www.example.com [nc]
RewriteRule ^(.*)$ http://www.example.com/$1 [r=301,nc] 

Tôi đang thiếu gì?


1
Đối với một .htaccessgiải pháp dựa trên tôi đề nghị một câu trả lời đã được đặt ra cho câu hỏi
diametral

Điều này là tốt, mặc dù nó thêm một dấu gạch chéo vào url, vì vậy mất dấu gạch chéo trước đồng đô la.
wuxmedia

Câu trả lời:


510

Sử dụng công cụ viết lại là một cách khá nặng nề để giải quyết vấn đề này. Đây là một giải pháp đơn giản hơn:

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

<VirtualHost *:80>
    ServerName www.example.com
    # real server configuration
</VirtualHost>

Và sau đó bạn sẽ có một <VirtualHost>phần khác với ServerName www.example.comcấu hình máy chủ thực sự của bạn. Apache tự động bảo tồn mọi thứ sau /khi sử dụng Redirectchỉ thị , đây là một quan niệm sai lầm phổ biến về lý do tại sao phương pháp này không hoạt động (trong thực tế nó thực hiện).


20
Làm thế nào để bạn làm điều đó cho một trang web có một máy chủ ảo ssl?
Shabbycoat

28
Tôi gặp lỗi "Trang web tại example.com đã dẫn đến quá nhiều chuyển hướng" khi sử dụng đề xuất này. Những người khác có vấn đề này?
Jonathan Berger

4
@BlackDivine: Không có gì kỳ diệu khi làm điều đó theo hướng khác. Đơn giản chỉ cần trao đổi www.exampleexamplebất cứ nơi nào chúng xuất hiện trong mẫu.
Greg Hewgill

11
@JonathanBerger Nếu bạn quá nhiều chuyển hướng, thì có lẽ bạn đã không cấu hình tốt tệp. Đảm bảo có 2 Virtualhost: một với không phải www, bên trên và bên kia là ServerName www.example.com có ​​cấu hình thực. Ngoài ra, hãy đảm bảo không có chuyển hướng trong cấu hình www.example.com (cả mod_alias và mod_rewrite).
Savas Vedova

3
Đối với một máy chủ lưu trữ ảo, giả sử example.com, tôi có Redirect 301 / http://example2.com/extra/nhưng khi nó chuyển hướng, nó bỏ lỡ dấu gạch chéo, nghĩa là example.com/blahđi đến example2.com/extrablah. Có ý kiến ​​gì không? (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
câu trả lời rất ngắn ... nhưng đến các điểm ... không chắc đây là phiếu bầu tăng hay giảm
thecoshman

2
Ôi thật gọn gàng, điều này có thể được bao gồm trong cấu hình máy chủ ở cấp cao nhất (và nếu vậy) sẽ áp dụng cho mọi máy chủ ảo!
thenickdude

Xin chào @burzumko làm thế nào để bạn đạt được điều này, điều này đúng với tất cả những người không có www, nhưng sau đó, hãy nói rằng example.com/subdi1/ws/* không có www?
Sensei đen

1
Tôi cũng đã sử dụng giải pháp này cho các máy chủ ảo HTTPS. Chỉ cần thêm một svào http trong hàng thứ ba.
Rodrigoap

46
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Điều này đã không làm việc cho tôi; nó đã gây ra một vòng lặp chuyển hướng vô hạn đến cùng một trang
dmiller309

1
@ dmiller309: Bạn có bao gồm www.trong ServerAlias?
cherouvim

2
Bạn nói đúng, tôi vô tình đặt www. trong ServerAlias ​​bằng cách sử dụng *. ký tự đại diện. Bởi vì tôi đã nhầm lẫn thứ tự của các mục Virtualhost, *. ký tự đại diện đã có cơ hội phù hợp khi tôi không nghĩ rằng nó sẽ.
dmiller309

7
Đây là câu trả lời tốt nhất, vì nó sạch sẽ, giữ đường dẫn (không giống như câu trả lời số 1) và không sử dụng Rewrite.
schieferstapel

30

Để xóa wwwkhỏi URLtrang web của bạn, hãy sử dụng mã này trong .htaccesstệp của bạn :

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

Để buộc wwwtrang web của bạn URLsử dụng mã này trên.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]

Trường hợp YourSite.comphải được thay thế bằng của bạn URL.


Câu trả lời hay nhất ở đây, vì nó hoạt động cho trang web có nhiều tên miền <3
Clement Herreman

2
Phần thứ hai với .html để làm gì ??
Nathan H

6
Xóa dấu gạch chéo trước $ 1 để không có dấu gạch chéo kép (//) sau khi chuyển hướng => RewriteRule ^ (. *) $ YourSite.com $ 1 [R = 301]
Kevin Campion

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>

Đây là những gì xảy ra với mã ở trên. Khối máy chủ ảo đầu tiên kiểm tra nếu yêu cầu là www.example.com và chạy trang web của bạn trong thư mục đó.

Không thành công, nó đến phần máy chủ ảo thứ hai. Ở đây, mọi thứ khác ngoài www.example.com đều được chuyển hướng đến www.example.com.

Thứ tự ở đây có vấn đề. Nếu bạn thêm lệnh virtualhost thứ hai trước, nó sẽ gây ra vòng lặp chuyển hướng.

Giải pháp này sẽ chuyển hướng mọi yêu cầu đến tên miền của bạn, đến www.yourdomain.com.

Chúc mừng!


16

Điều này tương tự với nhiều gợi ý khác với một vài cải tiến:

  • Không cần mã hóa tên miền (hoạt động với vhost chấp nhận nhiều tên miền hoặc giữa các môi trường)
  • Giữ nguyên lược đồ (http / https) và bỏ qua các tác động của các %{REQUEST_URI}quy tắc trước đó .
  • Phần đường dẫn không bị ảnh hưởng bởi RewriteRules trước đó %{REQUEST_URI}là.

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

4
Gân như hoan hảo. Nó phải là% {HTTP_HOST} $ 1, không phải% {HTTP_HOST} / $ 1 (hoặc nó sẽ tăng gấp đôi dấu gạch chéo)
Michael Wyraz 13/03/2016

@Michael Wyraz: Không tăng gấp đôi dấu gạch chéo ở đây?!
not2savvy

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

Điều này bắt đầu với HTTP_HOSTbiến chỉ chứa phần tên miền của URL đến ( example.com). Giả sử tên miền không chứa a www.và khớp chính xác với tên miền của bạn, thì RewriteRule sẽ xuất hiện. Mẫu ^(.*)$sẽ khớp với mọi thứ trong REQUEST_URIđó, là tài nguyên được yêu cầu trong yêu cầu HTTP ( foo/blah/index.html). Nó lưu trữ điều này trong một tham chiếu trở lại, sau đó được sử dụng để viết lại URL với tên miền mới (bắt đầu bằng www).

[NC]biểu thị khớp mẫu không phân biệt chữ hoa chữ thường, [R=301]biểu thị chuyển hướng bên ngoài bằng mã 301 (tài nguyên được di chuyển vĩnh viễn) và [L]dừng tất cả việc viết lại tiếp theo và chuyển hướng ngay lập tức.


6

Mã chuyển hướng cho cả không phải www => www và ngược lại www => không phải www. Không có tên miền và sơ đồ mã hóa cứng trong tệp .htaccess. Vì vậy, tên miền gốc và phiên bản http / https sẽ được giữ nguyên.

APACHE 2.4 VÀ MỚI HƠN

KHÔNG-WWW => WWW:

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

WWW => KHÔNG WWW:

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

Lưu ý: không hoạt động trên Apache 2.2 khi% {REQUEST_SCHEME} không khả dụng. Để tương thích với Apache 2.2, hãy sử dụng mã bên dưới hoặc thay thế% {REQUEST_SCHEME} bằng http / https cố định.


APACHE 2.2 VÀ MỚI hơn

KHÔNG-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]

... hoặc phiên bản ngắn hơn ...

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 => KHÔNG 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]

... không thể có phiên bản ngắn hơn vì% N chỉ khả dụng từ RewriteCond cuối cùng ...


Cấu hình Apache 2.4 đã khắc phục sự cố, cảm ơn vì câu trả lời rõ ràng .. !!
KimchiMan

5

Tôi đã chạy nó ...

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

Tôi cần điều này là phổ quát cho hơn 25 tên miền trên máy chủ mới của chúng tôi, vì vậy lệnh này nằm trong tệp virtual.conf của tôi trong thẻ <Directory>. (dir là cha mẹ của tất cả các docroots)

Mặc dù vậy, tôi đã phải thực hiện một chút hack về quy tắc viết lại, vì toàn bộ docroot đã được thực hiện trên khớp mẫu, bất chấp những gì http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html nói về nó chỉ là công cụ sau khi máy chủ và cổng.


5

Nếu bạn đang sử dụng Apache 2.4, không cần kích hoạt mô-đun apache viết lại, bạn có thể sử dụng một cái gì đó như thế này:

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

1
Câu trả lời không nản lòng. Sử dụng điều này, có thể tránh các vhost bổ sung, điều này tốt cho các tập lệnh LetEncrypt tự động.
Paul

Ngoài ra, nếu bạn đang sử dụng ANSIBLE, vì ANSIBLE 2.0, giờ đây bạn có thể dễ dàng chèn một khối vào một tệp trong một tác vụ, chi tiết tại đây docs.ansible.com/ansible/2.5/modules/blockinfile_module.html
sys0dm1n

3

Chuyển hướng domain.tld sang www.

Các dòng sau có thể được thêm vào trong các lệnh của Apache hoặc trong tệp .htaccess:

RewriteEngine on    
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • Các sudomain khác vẫn đang hoạt động.
  • Không cần điều chỉnh các dòng. chỉ cần sao chép / dán chúng vào đúng nơi.

Đừng quên áp dụng các thay đổi apache nếu bạn sửa đổi vhost.

(dựa trên Drupal7 .htaccess mặc định nhưng sẽ hoạt động trong nhiều trường hợp)


3

Cái này đơn giản!

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>

Điều này sẽ chuyển hướng không chỉ tên miền mà cả các trang bên trong.like ...

example.com/abcd.html                ==>     www.example.com/abcd.html
example.com/ab/cd.html?ef=gh    ==>    www.example.com/ab/cd.html?ef=gh


Cảm ơn vì điều đó. Rất hữu ích.
Anthony

2

Thử cái này:

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

2

Không phải lúc nào cũng sử dụng Redirect permanent(hoặc tại sao nó có thể gây ra sự cố trong tương lai)

Nếu có cơ hội bạn sẽ thêm tên miền phụ sau này, không sử dụng redirect permanent .

Bởi vì nếu khách hàng đã sử dụng một tên miền phụ chưa được đăng ký vì VirtualHostanh ta cũng có thể không bao giờ tiếp cận được tên miền phụ này ngay cả khi nó được đăng ký sau đó.

redirect permanent gửi một HTTP 301 Moved Permanently cho khách hàng (trình duyệt) và rất nhiều trong số họ lưu trữ phản hồi này mãi mãi (cho đến khi xóa bộ nhớ cache [thủ công]). Vì vậy, sử dụng tên miền phụ đó sẽ luôn tự động chuyển hướng đến www. *** mà không yêu cầu máy chủ lại.

xem bao lâu trình duyệt cache HTTP 301s?

Vì vậy, chỉ cần sử dụng Redirect

<VirtualHost *:80>
  ServerName example.com

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

Apache.org - Khi không sử dụng mod_rewrite

Apache.org - Tên máy chủ Canonical


1

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

kiểm tra công việc hoàn hảo này


0

Tôi chỉ có một vấn đề tương tự. Nhưng đã giải quyết nó

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

Quy tắc này chuyển hướng không www sang www.

Và quy tắc này để chuyển hướng www sang không www

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

Tham khảo từ http://dense13.com/blog/2008/02/27/redirecting-non-www-to-www-with-htaccess/


0

Điều này làm việc cho tôi:

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

Tôi sử dụng mẫu nhìn về phía trước (?!www.domain.com)để loại trừ wwwtên miền phụ khi chuyển hướng tất cả các tên miền sang wwwtên miền phụ để tránh vòng lặp chuyển hướng vô hạn trong Apache.


0

Mã tôi sử dụng là:

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

0

-Nếu bạn lưu trữ nhiều tên miền (Tùy chọn)

-Nếu tất cả các tên miền đó đang sử dụng https (như họ nên)

-Nếu bạn muốn tất cả các tên miền đó sử dụng www dot domainName

Điều này sẽ tránh chuyển hướng doble (http: // non www sang http: // www và sau đó đến 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>

Bạn nên thay đổi mã chuyển hướng 301 thành mã thuận tiện nhất


-1

Nếu sử dụng giải pháp trên của hai <VirtualHost *:80>khối với ServerName...

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

... sau đó bạn phải thiết lập NameVirtualHost Oncũng .

Nếu bạn không làm điều này, Apache không cho phép bản thân sử dụng các ServerNames khác nhau để phân biệt các khối, do đó bạn nhận được thông báo lỗi này:

[warn] _default_ VirtualHost overlap on port 80, the first has precedence

... và không có chuyển hướng nào xảy ra, hoặc bạn có một vòng lặp chuyển hướng vô hạn, tùy thuộc vào khối nào bạn đặt đầu tiên.


-1

Tôi đã có một nhiệm vụ tương tự trên WP Multisite, trong đó quy tắc chuyển hướng phải chung chung (đối với bất kỳ miền nào tôi muốn thêm vào mạng). Tôi đã giải quyết trước tiên bằng cách thêm ký tự đại diện vào miền (tên miền chưa sử dụng). Lưu ý sau .com.

CNAME * domain.com.

Và sau đó tôi đã thêm các dòng sau vào tệp .htaccess ở thư mục gốc của multisite của tôi. Tôi đoán nó sẽ làm việc cho bất kỳ trang web.

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

Hy vọng điều này sẽ giúp.

ps. Nếu bạn muốn chuyển hướng từ không www sang www, hãy thay đổi dòng cuối cùng thành

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

-2

Tôi thấy việc sử dụng ServerAlias ​​dễ dàng hơn (và hữu ích hơn) khi sử dụng nhiều vhost.

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

Điều này cũng hoạt động với https vhost.


Một downvote ổ đĩa khác. Muốn giải thích, trời ơi, vị thần vĩ đại của httpd, người không thể bận tâm để giải thích về downvote?
Anthony

1
Điều này làm cho nó để bạn có nhiều tên miền lưu trữ cùng một trang web. Tùy thuộc vào tình huống của bạn và máy chủ web bên dưới của bạn đang chạy, bạn sẽ gặp vấn đề với cookie không được xử lý, mọi người nhầm lẫn và các sự cố của công cụ tìm kiếm (sẽ xem đây là 2 trang web khác nhau).
Jeffrey Van Alstine
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.