2009-09-25 68 views
33

Tôi có một số miền hoạt động dưới một tệp .htaccess duy nhất, mỗi miền được bảo mật qua SSL. Tôi cần phải buộc https trên mọi tên miền trong khi cũng đảm bảo chuyển hướng của www sang không phải www. Đây là những gì tôi đang sử dụng mà không làm việc:.htaccess chuyển hướng www sang phi www bằng SSL/HTTPS

RewriteCond %{HTTP_HOST} ^www.%{HTTP_HOST} 
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI}/$1 [R=301,L] 

Ví dụ:

https://www.strategice.com 

nên chuyển hướng đến ...

https://strategice.com 

Cảm ơn trước!

+2

Đánh dấu một câu trả lời đúng rồi! –

Trả lời

16

Tình trạng của bạn sẽ không bao giờ đúng, bởi vì nó giống như "if (a == a + b)".

Tôi muốn thử như sau:

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

này sẽ nắm bắt được "google.com" từ "www.google.com" vào% 1, phần còn lại trong $ 1 và sau đó kết hợp 2, khi HTTP_HOST bắt đầu bằng www (có hoặc không có https).

+0

Thật không may điều này vẫn tạo ra lỗi "Kết nối không tin cậy" khi ai đó cố gắng truy cập https://www.domain.com – aegenes

+0

Hmm nhưng nó đang chuyển hướng đúng cách? Nếu đó có thể là vấn đề về chứng chỉ. – Fabian

+2

Xem [this] (http://stackoverflow.com/a/10726167/372643) để biết vấn đề về chứng chỉ. – Bruno

2

này đã làm việc cho tôi:

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

Giấy chứng nhận phải bao gồm cả www và không www https. Một số certs của nhà cung cấp bao gồm cả cho www.xxxx.yyy, nhưng chỉ một cho xxxx.yyy.

Bật viết lại:

RewriteEngine On 

Làm cho tất cả https sử dụng http:

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://xxx.yyy/$1 [L,R=301] 

Hãy chỉ https www sử dụng phi www https:

RewriteCond %{SERVER_PORT} 443 
RewriteCond %{HTTP_HOST} ^www[.].+$ 
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [L,R=301] 

có thể không được xử lý không -www https, nếu không một vòng lặp xảy ra.

Trong [L, R = 301]:

  1. L = Nếu quy tắc đã được xử lý, không xử lý nữa.
  2. R = 301 = Yêu cầu trình duyệt/rô-bốt thực hiện chuyển hướng vĩnh viễn.

More generic

Một cách tiếp cận chung chung hơn - chứ không phải cổng phụ thuộc - là:

RewriteCond %{HTTP_HOST} ^www\. 
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [R=301,QSA] 

thực hiện bất kỳ url với www thả nó.

RewriteCond %{HTTPS} !on 
RewriteCond %{HTTPS} !1 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteCond %{HTTP:X-Forwarded-SSL} !on 
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [R=301,QSA] 

để buộc bất kỳ url không phải https nào, ngay cả đối với những hệ thống hạ lưu từ trình cân bằng tải xuống https, hãy sử dụng https.

Lưu ý rằng tôi chưa thử nghiệm các tùy chọn forwarded, vì vậy sẽ đánh giá cao phản hồi về bất kỳ sự cố nào với chúng.Những dòng này có thể bị bỏ sót nếu hệ thống của bạn không nằm phía sau bộ cân bằng tải.

ĐẾN HTTP_HOST hay không

Bạn có thể sử dụng ${HTTP_HOST} là một phần của URL trong RewriteRule, hoặc bạn có thể sử dụng rõ ràng kinh điển văn bản tên miền của bạn (xxxx.yyy ở trên).

Chỉ định tên miền một cách rõ ràng đảm bảo rằng không có phương tiện uốn nhân vật nào được sử dụng trong URL do người dùng cung cấp để lừa trang web của bạn làm điều gì đó có thể không được chuẩn bị, hoặc ít nhất đảm bảo rằng tên miền thích hợp xuất hiện trong thanh địa chỉ, bất kể chuỗi URL nào đã mở trang.

Nó thậm chí có thể giúp chuyển đổi các tên miền mã hóa punycode để hiển thị các ký tự unicode thích hợp trong thanh địa chỉ.

+0

Hoạt động như một sự quyến rũ! –

+0

Hoạt động đáng kinh ngạc! Cảm ơn lời giải thích. –

44

www để phi www với https

RewriteEngine on 

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

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

"RewriteRule^(. *) $ Http: //% 1/$ 1 [R = 301, L]" đã được đổi thành "RewriteRule^(. *) $ Https: //% 1/$ 1 [R = 301, L ] "(by @KenVerhaegen) nếu không" trước tiên nó sẽ chuyển hướng đến không phải http, và sau đó đến https ... vì vậy bây giờ chúng ta có thể tránh chuyển hướng thứ hai có thể kích hoạt. " – alexbt

1
RewriteEngine On 

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

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

này làm việc cho tôi sau nhiều thử và sai. Phần thứ nhất là từ người dùng ở trên và sẽ chụp www.xxx.yyy và gửi cho https://xxx.yyy

Phần 2 xem xét các URL và kiểm tra vào nếu HTTPS, nếu không, nó sẽ gửi tới HTTPS

Xong theo thứ tự này, nó theo logic và không có lỗi xảy ra.

ĐÂY là phiên bản của tôi ĐẦY ĐỦ ở bên htaccess với WordPress:

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

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


# BEGIN WordPress 
<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase/
RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule> 

# END WordPress 
2

Để thực thi phi wwwhttps trong một yêu cầu duy nhất, bạn có thể sử dụng Rule sau trong htaccess của bạn:

RewriteEngine on 

RewriteCond %{HTTP_HOST} ^www\. [OR] 
RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ 
RewriteRule^https://%1%{REQUEST_URI} [NE,L,R] 

này chuyển hướng http://www.example.com/ hoặc https://www.example.com/ tới ssl non-www https://example.com/.

Tôi đang sử dụng R Cờ chuyển hướng tạm thời cho mục đích thử nghiệm và để tránh bộ nhớ đệm của trình duyệt. Nếu bạn muốn đặt chuyển hướng vĩnh viễn, chỉ cần thay đổi cờ R thành R = 301.

+0

hmm nhưng vẫn khi tôi vào trang web với www safari nói rằng trang không an toàn và opera không muốn chuyển hướng bất kỳ tùy chọn nào có hoặc không có www đến ssl, tại sao? –

1

Ref: Apache redirect www to non-www and HTTP to HTTPS

http://example.com

http://www.example.com

https://www.example.com

để

https://example.com

RewriteEngine On 
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP_HOST} ^www\. [NC] 
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] 
RewriteRule^https://%1%{REQUEST_URI} [L,NE,R=301] 

Nếu thay vì example.com bạn muốn URL mặc định là www.example.com, sau đó chỉ cần thay đổi dòng thứ ba và thứ năm:

RewriteEngine On 
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP_HOST} !^www\. [NC] 
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] 
RewriteRule^https://www.%1%{REQUEST_URI} [L,NE,R=301] 
Các vấn đề liên quan