Sử dụng .htaccess để chuyển hướng HTTP sang HTTPs


77

Xin đừng giới thiệu cho tôi một chủ đề dài và rất chi tiết với hơn 173 lượt bình chọn. Nó không hiệu quả với tôi. Tôi cũng đã thử nhiều người khác ( 1 , 2 , 3 , 4 ). Tất cả đều cho tôi TOO_MANY_REDIRECTS hoặc lỗi 500. Vì vậy, đây là vấn đề của tôi:

Với .htaccess hiện tại của tôi, đây là những gì sẽ xảy ra:

https://www.dukescasino.com/ - hoạt động hoàn hảo

https://dukescasino.com/ - chuyển hướng đến phần trên, thật tuyệt

Hai tùy chọn bên dưới tải tốt, nhưng nó sẽ chuyển hướng đến phiên bản https:

http://www.dukescasino.com/

http://dukescasino.com/

Đây là .htaccess hiện tại:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

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

Tôi không tin rằng nó có liên quan, nhưng nếu vậy, đây là danh sách các plugin đang hoạt động hiện tại:

  • Trường tùy chỉnh nâng cao
  • Gói SEO Tất cả Trong Một
  • Loại mục hộp tìm kiếm Bop cho menu điều hướng
  • Mẫu liên hệ 7
  • Tắt nhận xét
  • Sơ đồ trang web XML của Google
  • Jetpack của WordPress.com
  • Tìm kiếm & Lọc
  • Thanh trượt WD
  • TablePress
  • UpdraftPlus - Sao lưu / Khôi phục
  • Bảo mật Wordfence
  • WPide
  • WP Smush
  • WP Super Cache

Chỉnh sửa 1 - Các thử nghiệm đã thực hiện:

Kiểm tra A:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} off
# First rewrite to HTTPS:
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Now, rewrite any request to the wrong domain to use www.
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

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

Kết quả: ERR_TOO_MANY_REDIRECTS

Kiểm tra B:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

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

Kết quả: ERR_TOO_MANY_REDIRECTS

Kiểm tra C:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{SERVER_PORT} ^80$
 RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

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

Kết quả: ERR_TOO_MANY_REDIRECTS

Kiểm tra D:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

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

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

Kết quả: ERR_TOO_MANY_REDIRECTS

Kiểm tra E:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

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

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

Kết quả: Đã tìm thấy 302. Ngoài ra, lỗi 500 Internal Server Error đã gặp phải khi cố gắng sử dụng ErrorDocument để xử lý yêu cầu.


Có thể chỉ là một lỗi chính tả, nhưng bạn đã viết .htaccesssai chính tả (cùng một cách) 3 lần? Tệp .htaccess hiện tại của bạn chưa hoàn tất, bạn đang thiếu RewriteEngine Onchỉ thị. Có lẽ, khi bạn thêm chuyển hướng chuẩn, bạn đang thêm điều này vào đầu tệp .htaccess của mình? Bạn nói rằng https://example.comchuyển hướng OK, tuy nhiên, điều này không được chỉ ra trong tệp cấu hình của bạn? Điều này đang xảy ra ở đâu / như thế nào? Sẽ rất hữu ích nếu biết những gì bạn đã thực sự thử - điều đó không hiệu quả.
MrWhite

Xin lỗi, .htaccess là một lỗi chính tả, tôi đã sửa nó ngay bây giờ. Tôi cũng đã cập nhật mã .htaccess hiện tại và tất cả các bài kiểm tra tôi đã thực hiện với kết quả của mỗi mã. Tôi không biết làm thế nào mà https không có www lại chuyển hướng đến phiên bản www . Cảm ơn
Cristiano Maia

Bạn thường mong đợi biến máy chủ HTTPSđược đặt (kết quả của bạn đề xuất khác). Bạn có đang sử dụng proxy không? (Kiểm tra E có khả năng dẫn đến một số loại "đệ quy" 404?)
MrWhite

Tôi vừa liên hệ với 123-reg (công ty cung cấp dịch vụ lưu trữ) để kiểm tra xem họ có thiết lập bất kỳ điều gì đang làm rối tung mọi thứ không. Ngay cả khi tôi có .htaccess đang hoạt động và thiết lập công cụ chuyển hướng bên trong bảng điều khiển (123reg) của họ, tôi vẫn nhận được ERR_TOO_MANY_REDIRECTS.
Cristiano Maia

Câu trả lời:


141

Trên Dreamhost, điều này đã hoạt động:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

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

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

1
Điều này được làm việc cho tôi trên lưu trữ chia sẻ namecheap.
Liakat

1
Làm việc trên asmallorange.com quá
Leonardo Herrera

Đã làm việc cho tôi trên máy chủ LAMP với Wordpress 4.7.4 trên nhà cung cấp Time4VPS
John Smith

Đảm bảo sắp xếp chính xác các quy tắc. Tôi đã đặt quy tắc viết lại theo các quy tắc WordPress hiện có, nhưng sau đó chỉ miền gốc được định tuyến lại chứ không phải bất kỳ yêu cầu HTTP URI nào. Thứ tự chính xác này bên trên các quy tắc WordPress hiện có định tuyến tất cả các yêu cầu HTTP đúng cách.
delrocco

3
Không cần phải chỉ ra từng máy chủ duy nhất hoạt động trên đó! Đó là một đoạn mã đơn giản cho .htaccess, vì vậy nó sẽ hoạt động trên hầu hết các hệ thống mà chúng chấp nhận .htaccess. Nếu nó không hoạt động thì đó là do một trường hợp kỳ quặc.
Phill Healey

91

Vấn đề đã được giải quyết!

.Htaccess cuối cùng:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

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

19
Thay đổi này dẫn đến "[www.domain.com] đã chuyển hướng bạn quá nhiều lần" cho miền tôi lưu trữ trên Dreamhost. Không may mắn. Tuy nhiên, điều này đã hoạt động: RewriteCond% {HTTPS}! = Trên RewriteRule ^ https: //% {HTTP_HOST}% {REQUEST_URI} [L, R = 301]
Jason Shah,

11
Tôi đã phải thay đổi chỉ RewriteCondvới một sau đây để tránh too many redirects:RewriteCond %{HTTPS} !=on
lucaferrario

Đối với tôi trên virtualmin apache 2.4 bị cấm. Giải pháp từ @ jason-shah đã hoạt động.
Aleksandar Pavić

Không hiệu quả với tôi. Giải pháp này chuyển hướng "bạn quá nhiều lần." chrome nói.
zhekaus

3
Đây là giải pháp duy nhất phù hợp với tôi. (Đã thử nghiệm quá nhiều.) "ENV:" rất quan trọng. Từ các câu trả lời và các giải pháp khác, có vẻ như trên một số máy chủ lưu trữ, bạn hoặc phải đưa nó vào trong khi trên những máy chủ khác, bạn phải loại bỏ nó . BTW Đối với bất kỳ ai muốn sử dụng điều này, hãy xem xét sử dụng R=301thay vì chỉ R(có nghĩa là chuyển hướng 302).
Vit Kovalcik

15

Nó hoạt động cho tôi:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !on           
RewriteRule ^(.*) https://%{SERVER_NAME}/$1 [R,L]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

11

Trong trường hợp của tôi, tệp htaccess chứa rất nhiều quy tắc được cài đặt bởi các plugin như Far Future ExpirationWPSuperCache và cả các dòng từ chính wordpress.

Để không làm mọi thứ rối tung lên, tôi phải đặt giải pháp ở đầu htaccess (điều này rất quan trọng, nếu bạn đặt nó ở cuối nó gây ra một số chuyển hướng sai do xung đột với plugin bộ nhớ cache)

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

Bằng cách này, các dòng của bạn không bị xáo trộn bởi wordpress trong trường hợp một số cài đặt thay đổi. Ngoài ra, <IfModule>phần này có thể được lặp lại mà không gặp bất kỳ vấn đề gì.

Tôi phải cảm ơn Jason Shahquy tắc htaccess gọn gàng .


Đây là thông tin cần thiết. Cảm ơn vì đã đăng nó!
Henrik Petterson

4

Đối với thông tin của bạn, nó thực sự phụ thuộc vào nhà cung cấp dịch vụ lưu trữ của bạn.

Trong trường hợp của tôi ( Infomaniak ), không có gì ở trên thực sự hoạt động và tôi nhận được vòng lặp chuyển hướng vô hạn.

Cách đúng để làm điều này thực sự được giải thích trong trang web hỗ trợ của họ :

RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://your-domain.com/$1 [R=301,L]

Vì vậy, hãy luôn kiểm tra với nhà cung cấp dịch vụ lưu trữ của bạn. Hy vọng rằng họ có một bài viết giải thích làm thế nào để làm điều này. Nếu không, chỉ cần yêu cầu hỗ trợ.


2

Điều này đã được thử nghiệm và an toàn để sử dụng

Tại sao ?: Khi Wordpress chỉnh sửa quy tắc viết lại của bạn , vì vậy hãy đảm bảo quy tắc HTTPS của bạn không bị xóa ! vì vậy điều này không có xung đột với các quy tắc Wordpress gốc.

<IfModule mod_rewrite.c>
   RewriteCond %{HTTPS} !=on
   RewriteRule ^(.*) https://%{SERVER_NAME}/$1 [R,L]
</IfModule>

# BEGIN WordPress
<IfModule mod_rewrite.c>
  #Your our Wordpress rewrite rules...
</IfModule>
# END WordPress

Lưu ý: Bạn cũng phải thay đổi url Địa chỉ & Địa chỉ trang WordPress thành https://trong Cài đặt chung ( wp-admin/options-general.php)


Phần WordPress nên chạy sau HTTPS, nếu không nó sẽ không hoạt động. Hoặc, ít nhất, đây là những gì đã xảy ra với tôi :)
Ste_95

Xác nhận những gì @ Ste_95 đã nói. Tôi đã phải đặt khối viết lại HTTPS trước cấu hình liên kết cố định WP mặc định.
Justin Tilson

1

Rất tiếc, tôi thấy tất cả các giải pháp được liệt kê trong phần Hỏi & Đáp này không phù hợp với tôi. Những gì đã làm là:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L]

RewriteCond %{HTTP_HOST} ^example\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRule ^/?$ "https\:\/\/www\.example\.com\/" [R=301,L]
</IfModule>
# End Wordpress

Lưu ý, các quy tắc Wordpress trên dành cho Wordpress ở chế độ mạng nhiều người dùng. Nếu Wordpress của bạn ở chế độ một trang web, bạn sẽ sử dụng:

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

RewriteCond %{HTTP_HOST} ^example\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRule ^/?$ "https\:\/\/www\.example\.com\/" [R=301,L]
</IfModule>
# End Wordpress

1

Không có gì ở trên làm việc cho tôi. Nhưng những dòng đó đã giải quyết cùng một vấn đề trên trang WordPress của tôi:

RewriteEngine On

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

1

cách dễ dàng nhất để chuyển hướng http sang https trong wordpress để sửa đổi site_url và home từ http://example.com thành https://example.com . Wordpress sẽ thực hiện chuyển hướng. (đó là lý do tại sao bạn gặp lỗi "quá nhiều chuyển hướng", wordpress đang chuyển hướng đến http trong khi .htaccess sẽ chuyển hướng đến https)


Tôi không chắc nó thực hiện bất kỳ chuyển hướng nào cho SEO :)
jcdarocha 13/02

1
chắc chắn là có. chuyển hướng 301 (vĩnh viễn), google sẽ lập chỉ mục lại
Rafael

Hãy nhớ rằng tính năng này không hoạt động với Google Search Console!
Hexodus

nó sẽ hoạt động tốt .... wordpress sẽ thực hiện chuyển hướng (301). hãy ghi nhớ điều này: rtfm
Rafael

0

Đây là một giải pháp thay thế mà bạn có thể sử dụng nếu không muốn chỉnh sửa .htaccess:

add_action( 'template_redirect', 'nonhttps_template_redirect', 1 );

function nonhttps_template_redirect() {

    if ( is_ssl() ) {

        if ( 0 === strpos( $_SERVER['REQUEST_URI'], 'https' ) ) {

            wp_redirect( preg_replace( '|^http://|', 'https://', $_SERVER['REQUEST_URI'] ), 301 );

            exit();

        } else {

            wp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], 301 );

            exit();

        }

    }

}

Bạn có thể đặt cái này ở cuối chủ đề của mình functions.php


Vẫn chưa hoàn toàn chắc chắn, tôi đoán là nó sẽ vẫn như cũ tùy thuộc vào lý do Google có thể lập chỉ mục nó như là phiên bản HTTPS để bắt đầu.
Mã hóa cao hơn

0

Thêm cái này vào tệp .htaccess của WordPress:

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

Do đó, tệp .htaccess mặc định của WordPress sẽ có dạng như sau:

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

RewriteCond %{HTTP_HOST} ^yoursite.com [NC,OR]
RewriteCond %{HTTP_HOST} ^www.yoursite.com [NC]
RewriteRule ^(.*)$ https://www.yoursite.com/$1 [L,R=301,NC]
</IfModule>

0
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTPS} !=on
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^digitalsoftwaremarket.com [NC]
    RewriteRule ^(.*)$ http://www.digitalsoftwaremarket.com/$1 [L,R=301]
</IfModule>

0

Truy cập .htaccess cuối cùng và Kiểm tra A, B, C, D, E ở trên không hoạt động với tôi. Tôi chỉ sử dụng mã dưới 2 dòng và nó hoạt động trong trang web WordPress của tôi:

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

Tôi không chắc mình đã mắc lỗi ở đâu nhưng trang này đã giúp tôi.


0

Không nếu điều này làm việc cho tôi. Trước hết, tôi phải xem xét nhà cung cấp của mình để xem cách họ kích hoạt SSL trong .htaccessnhà cung cấp của tôi

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{HTTP:HTTPS} !on
   RewriteRule (.*) https://%{SERVER_NAME}/$1 [QSA,L,R=301]
</IfModule>

Nhưng điều khiến tôi mất nhiều ngày nghiên cứu là tôi phải thêm vào wp-config.phpnhững dòng sau vì trang web được cung cấp của tôi nằm sau proxy:

/**
 * Force le SSL
 */
define('FORCE_SSL_ADMIN', true);
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) $_SERVER['HTTPS']='on';

0

Chỉ cần thêm hoặc thay thế mã này trong tệp .htaccess của bạn trong wordpress

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

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

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

0

Chuyển hướng từ http sang https: // www

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

Điều này chắc chắn sẽ hoạt động!


-1

Chỉ cần thêm mã này, và nó sẽ hoạt động giống như sự quyến rũ:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP_HOST}#%{HTTPS}s ^www\.([^#]+)#(?:off|on(s)) [NC]
    RewriteRule ^ http%2://%1%{REQUEST_URI} [R=301,L]
</IfModule>
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.