Chuyển hướng không www sang www trong .htaccess


188

Tôi có cái này trong tập tin .htaccess của tôi:

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

nhưng bất cứ khi nào tôi truy cập một tập tin trên root của tôi như http://example.com/robots.txtnó sẽ chuyển hướng đến http://www.example.comrobots.txt/.

Làm thế nào tôi có thể sửa điều này để nó sẽ chuyển hướng chính xác đến http://www.example.com/robots.txt?

Câu trả lời:


388

Thay đổi cấu hình của bạn thành cái này (thêm dấu gạch chéo):

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

Hoặc giải pháp được nêu dưới đây (được đề xuất bởi @absiddiqueLive ) sẽ hoạt động cho bất kỳ miền nào:

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

Nếu bạn cần hỗ trợ http và https và duy trì lựa chọn giao thức, hãy thử như sau:

RewriteRule ^login\$ https://www.%{HTTP_HOST}/login [R=301,L]

Nơi bạn thay thế loginbằng checkout.phphoặc bất kỳ URL nào bạn cần để hỗ trợ HTTPS trên.

Tôi cho rằng đây là một ý tưởng tồi. Đối với lý do xin vui lòng đọc câu trả lời này .


Giải pháp này không hoạt động khi một số trang (như đăng nhập hoặc đăng ký) sử dụng giao thức https.
Alexey Kosov

Tôi đã cập nhật bài viết một chút để bao gồm một số thông tin. Thật khó để nói chung và chính xác chọn giao thức để sử dụng.
Randall Hunt

2
Giải pháp đầu tiên không chuyển hướng đủ, thứ 2 dường như chuyển hướng quá nhiều. Ví dụ: blog.example.comtrở thànhwww.blog.example.com
gman

Bạn có thể vui lòng thêm cách tránh chuyển hướng trong khi phát triển trên localhost không?
Bugs Bunny

Tôi đã theo dõi mọi thứ ở đây nhưng không có gì là làm việc. Tôi đang sử dụng một thiết lập laravel. Có ai có ý tưởng tại sao điều này không làm việc cho tôi? Cả www.domain.com và domain.com đều tải đúng nhưng domain.com không chuyển hướng đến www.domain.com. Đây có thể là một vấn đề với DNS của tôi?
xin chào thế giới

92

Đây là giải pháp chính xác hỗ trợ https và http:

# Redirect to www
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

7
Điều này là hoàn hảo, nó cũng không chuyển hướng tên miền phụ wwwgiống như các giải pháp chung khác làm.
Fabian Schmengler

4
Đây là một giải pháp tốt nhất, hoạt động tốt hơn nhiều so với câu trả lời được chấp nhận và chăm sóc HTTPS đúng cách
Tamik Soziev

3
Hoạt động hoàn hảo! Và trong vài dòng như vậy!
zeckdude

7
ĐÂY LÀ TRẢ LỜI TỐT NHẤT
Andrew

7
Nếu tôi không nhầm, điều này sẽ không hoạt động nhiều hơn một dấu chấm. Ví dụ:yoursite.co.uk
TrashyMcTrash

82
RewriteEngine On

RewriteCond %{HTTP_HOST} !^www\.

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

Đối với Https

RewriteCond %{HTTPS}s ^on(s)|

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

7
Giải pháp này được ưu tiên cho @ ranman vì nó sẽ hoạt động cho tất cả các tên miền, do đó giảm thiểu lỗi của con người khi bạn triển khai mã cho dự án mới hoặc khi bạn triển khai thêm tên miền cho dự án hiện có.
Frankie

Tôi thích giải pháp này, nhưng tại sao ^(.*)$thay vì (.*)?
Popnoodles

Giải pháp này tốt hơn nhưng tôi cũng đã chỉnh sửa để chứa của bạn.
Randall Hunt

1
Điều này đang làm việc cho tất cả các tên miền đơn giản và hiệu quả! Cảm ơn bạn
eirenaios

bạn có thể theo dõi RewriteCond% {HTTPS} s ^ trên (s) | RewriteRule ^ http% 1: //www.% {HTTP_HOST} / $ 1 [R = 301, L]
absiddiqueLive

23

Ví dụ sau hoạt động trên cả sslkhông ssl và nhanh hơn nhiều khi bạn chỉ sử dụng một quy tắc để quản lý http và https

RewriteEngine on


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

[Thử nghiệm]

Điều này sẽ chuyển hướng

http

đến

https

đến


1
Rất gần với những gì tôi nghĩ ra. Cũng hỗ trợ nhiều hơn một dấu chấm trong máy chủ HTTP, ví dụ "mysite.co.uk".
Adambean 7/07/2016

2
Vì tò mò, tại sao bạn không sử dụng R = 301 ở đây? Nó sẽ sử dụng 302 (di chuyển temp.) Theo mặc định nếu không có mã được chỉ định.
Marc

1
Hoạt động hoàn hảo. Đây phải là câu trả lời được chấp nhận.
James Nisbet

8

Hãy thử điều này, tôi đã sử dụng nó trong nhiều trang web, nó hoạt động hoàn hảo

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

4

Tôi đã thử nghiệm tất cả các giải pháp trên nhưng không hiệu quả với tôi, tôi đã cố gắng xóa http: // và sẽ không chuyển hướng cũng xóa www mà nó chuyển hướng tốt, vì vậy tôi cảm thấy bối rối, đặc biệt tôi đang chạy tất cả các trang web của mình dưới https : //

Vì vậy, tôi đã kết hợp một số mã với nhau và đưa ra giải pháp hoàn hảo cho cả http: // và https: // và www và không www.

# HTTPS forced
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Redirect to www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

Hy vọng điều này có thể giúp ai đó :)



3

Cấu hình này hoạt động với tôi trong wordpress bitnami với cấu hình SSL:

Đã thêm phần bên dưới trong "RewriteEngine On" trong tệp /opt/bitnami/apps/wordpress/conf/httpd-app.conf

RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteBase /
RewriteCond %{HTTPS} !on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

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

Điều này sẽ chuyển hướng tên miền của bạn không được bắt đầu với WWW Nó không chuyển hướng tất cả tên miền phụ của bạn.

Nó rất hữu ích.


2

Tôi tin rằng câu trả lời hàng đầu đã chuyển hướng thành công từ www sang www (ví dụ: mysite.com -> www.mysite.com ), nhưng không tính đến các tên miền phụ ký tự đại diện, dẫn đến:

random.mysite.com -> www.random.mysite.com

Đây là một giải pháp có / không có HTTPS

HTTP

RewriteEngine On

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

HTTP / HTTPS

RewriteEngine On

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=protocol:https]

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=protocol:http]

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

* lưu ý: Tôi chưa kiểm tra https vì hiện tại tôi không có chứng chỉ để kiểm tra, nhưng nếu ai đó có thể xác minh hoặc tối ưu hóa những gì tôi có thì điều đó thật tuyệt vời.


$ Đầu tiên làm gì ở đây: '^ (. *) $'
Vaishal Patel

0

Nếu có thể, hãy thêm nó vào tệp cấu hình chính của Apache. Nó là một giải pháp trọng lượng nhẹ hơn, yêu cầu xử lý ít hơn.

<VirtualHost 64.65.66.67>
        ServerName example.com
        Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost 64.65.66.67>
   ServerAdmin me@example.com
   ServerName www.example.com
   DocumentRoot /var/www/example
   .
   .
   . etc

Vì vậy, riêng biệt VirtualHostcho "example.com" nắm bắt những yêu cầu đó và sau đó chuyển hướng vĩnh viễn chúng đến mục chính của bạn VirtualHost. Vì vậy, không có phân tích REGEX với mỗi yêu cầu và trình duyệt máy khách của bạn sẽ lưu bộ đệm chuyển hướng để họ sẽ không bao giờ (hoặc hiếm khi) yêu cầu url "sai" nữa, giúp bạn tiết kiệm khi tải máy chủ.

Lưu ý, dấu gạch chéo trong Redirect permanent / http://www.example.com/. Không có nó, một chuyển hướng từ example.com/asdfsẽ chuyển hướng đến http://www.example.comasdfthay vì http://www.example.com/asdf.


0

Hai cảnh báo

Tránh 301 và thích mã trạng thái phản hồi hiện đại 303 hoặc 307.

Tránh 301

Hãy suy nghĩ cẩn thận nếu bạn thực sự cần chuyển hướng vĩnh viễn được chỉ định [R=301]vì nếu bạn quyết định thay đổi nó sau này, thì những khách truy cập trước đó của trang sẽ tiếp tục thấy trang của chuyển hướng ban đầu.

Thông tin chuyển hướng vĩnh viễn thường được lưu trữ trong bộ đệm của trình duyệt và nói chung, rất khó để loại bỏ (tải lại trang không giải quyết được vấn đề). Khách truy cập trang web của bạn sẽ bị kẹt trong chuyển hướng trước đó "mãi mãi".

Tránh 302 quá

Phiên bản mới của giao thức HTTP (v1.1) đã thêm hai mã trạng thái phản hồi mới có thể được sử dụng thay vì 302.

  • 303 Chuyển hướng URL nhưng yêu cầu thay đổi loại yêu cầu thành GET.
  • 307 Chuyển hướng URL nhưng yêu cầu giữ loại yêu cầu như đã gửi ban đầu.

Bạn vẫn có thể sử dụng mã 302(chuyển hướng không cố định) mặc dù nó được coi là mơ hồ. Trong mọi trường hợp, hầu hết các trình duyệt đều thực hiện 302theo cùng một cách mà 303mã mới hướng dẫn.


liên quan đến cảnh báo của bạn về 301, điều này sẽ áp dụng ngay cả khi chúng ta đang nói về cùng một tên miền? không chắc chắn làm thế nào điều này sẽ áp dụng trong trường hợp này ... chuyển hướng tất cả các URL từ http://example.com/testingđến http://www.example.com/testing. Có thể là một cách tiếp cận xấu trong dài hạn? Cảm ơn,
Sara_ 23/07/18

-1

Viết bằng .htaccess :)

## Redirect from non-www to www (remove the two lines below to enable)
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

1
Tương tự như các câu trả lời khác
Ankit
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.