Використовуйте .htaccess для перенаправлення HTTP на HTTP


77

Будь ласка, не рекомендуйте мені довгий і дуже детальний потік з більш ніж 173 голосами проти. У мене це не спрацювало. Я також пробував багато інших ( 1 , 2 , 3 , 4 ). Всі вони дають мені TOO_MANY_REDIRECTS або помилку 500. Отже, ось моя проблема:

З моїм поточним .htaccess відбувається ось що:

https://www.dukescasino.com/ - працює ідеально

https://dukescasino.com/ - переспрямовує на вищезазначене, що чудово

Два варіанти нижче завантажуються нормально, але це має бути перенаправлення на версію https:

http://www.dukescasino.com/

http://dukescasino.com/

Ось поточний .htaccess:

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

Я не вважаю, що це актуально, але якщо так, то ось список поточних активних плагінів:

  • Додаткові власні поля
  • Все в одному пакеті SEO
  • Тип елемента вікна пошуку Bop для навігаційних меню
  • Контактна форма 7
  • Вимкнути коментарі
  • Google XML Sitemap
  • Jetpack від WordPress.com
  • Пошук і фільтр
  • Повзунок WD
  • TablePress
  • UpdraftPlus - Резервне копіювання / відновлення
  • Захист Wordfence
  • WPide
  • WP Smush
  • WP Super Cache

Редагування 1 - Виконані тести:

Тест А:

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

Результат: ERR_TOO_MANY_REDIRECTS

Тест 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>

Результат: ERR_TOO_MANY_REDIRECTS

Тест С:

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

Результат: ERR_TOO_MANY_REDIRECTS

Тест 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>

Результат: ERR_TOO_MANY_REDIRECTS

Тест Е:

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

Результат: 302 знайдено. Крім того, під час спроби використовувати ErrorDocument для обробки запиту виникла помилка 500 внутрішньої помилки сервера.


Можливо, просто друкарська помилка, але ви .htaccessнеправильно написали (однаково) 3 рази? Ваш поточний файл .htaccess не завершений, вам не вистачає RewriteEngine Onдирективи. Імовірно, коли ви додаєте канонічне перенаправлення, ви додаєте це в самий верх вашого файлу .htaccess? Ви заявляєте, що https://example.comпереспрямовує ОК, проте, це не вказано у вашому конфігураційному файлі? Де / як це відбувається? Було б корисно знати, що ви насправді пробували - це не працює.
MrWhite

На жаль, .htaccess був друкарською помилкою, я зараз це виправив. Я також оновив поточний код .htaccess та всі тести, які я провів, з результатами кожного. Я не знаю, як https без www переспрямовує на версію www . Дякую
Кріштіану Майя

Зазвичай ви очікуєте встановлення змінної сервера HTTPS(результати показують інше). Ви за проксі? (Тест E, швидше за все, призведе до якогось "рекурсивного" 404?)
MrWhite

Я щойно зв’язався з 123-reg (хостинговою компанією), щоб перевірити, чи не налаштовано на їхньому боці щось, що заплутує справи. Навіть якщо у мене є робочий .htaccess і налаштований інструмент переспрямування всередині їх (123reg) панелі управління, я отримую ERR_TOO_MANY_REDIRECTS.
Кріштіану Майя

Відповіді:


141

На Dreamhost це спрацювало:

<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
Це працює для мене на спільному хостингу namecheap.
Liakat 02

1
Працював і на asmallorange.com
Леонардо Еррера

Працював у мене на сервері LAMP з Wordpress 4.7.4 на постачальника Time4VPS
Джон Сміт,

Переконайтеся, що правильне впорядкування правил правильно. Я встановив правило перезапису під існуючі правила WordPress, але тоді перенаправлявся лише кореневий домен, а не будь-які запити URI HTTP. Це правильне упорядкування вище існуючих правил WordPress правильно спрямовує всі запити HTTP.
delrocco

3
Не потрібно вказувати на кожного хоста, на якому це працює! Це простий біт коду для .htaccess, тому він повинен працювати в більшості систем, які вони приймають .htaccess. Якщо це не працює, це через дивний сценарій.
Phill Healey

91

Проблема вирішена!

Остаточний .htaccess:

<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
Ця зміна призвела до того, що "[www.domain.com] перенаправляв вас занадто багато разів" для домену, який я розміщую на Dreamhost. Нещастить. Однак це спрацювало: RewriteCond% {HTTPS}! = На RewriteRule ^ https: //% {HTTP_HOST}% {REQUEST_URI} [L, R = 301]
Джейсон Шах

11
Мені довелося змінити лише на RewriteCondнаступне, щоб уникнути too many redirects:RewriteCond %{HTTPS} !=on
lucaferrario

Для мене на virtualmin apache 2.4 викликаний заборонено. Рішення від @ jason-shah спрацювало.
Aleksandar Pavić

Не працює у мене. Це рішення переспрямовує "вас занадто багато разів". - говорить хром.
zhekaus

3
Це єдине рішення, яке спрацювало для мене. (Перевірено занадто багато.) "ENV:" був вирішальним. З відповідей та інших рішень виглядає так, що на деяких хостах ви або повинні його включити, а на інших - залишити . До речі, для тих, хто хоче використовувати це, розгляньте можливість використання R=301замість просто R(що означає перенаправлення 302).
Віт Ковальчик

15

Це працює для мене:

# 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

У моєму випадку файл htaccess містив безліч правил, встановлених плагінами, такими як Far Future Expiration та WPSuperCache, а також рядки з самого WordPress.

Щоб не заплутувати щось, мені довелося поставити рішення вгорі htaccess (це важливо, якщо ви помістите його в кінці, це спричинить неправильні перенаправлення через конфлікти з плагіном кешу)

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

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

Таким чином, ваші рядки не псуються в wordpress у разі зміни деяких налаштувань. Також <IfModule>розділ можна без проблем повторити.

Я повинен подякувати Джейсону Шаху за акуратне правило htaccess .


Це важлива інформація. Дякуємо за розміщення!
Генрік Петтерсон,

4

Для вашої інформації це дійсно залежить від вашого хостинг-провайдера.

У моєму випадку ( Infomaniak ) нічого вище насправді не працювало, і я отримав нескінченний цикл перенаправлення.

Правильний спосіб зробити це насправді пояснюється на їх веб-сайті підтримки :

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

Отже, завжди звертайтесь до свого хостинг-провайдера. Сподіваємось, у них є стаття, яка пояснює, як це зробити. В іншому випадку просто попросіть підтримки.


2

Це перевірено та безпечно у використанні

Чому?: Коли Wordpress редагує правила перезапису , переконайтеся, що правило HTTPS не слід видаляти ! тож це не суперечить рідним правилам Wordpress.

<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

Примітка: Ви повинні змінити WordPress Адреса та адреса сайту URLs до https://в загальних налаштуваннях також ( wp-admin/options-general.php)


Частина WordPress повинна йти після HTTPS, інакше вона не буде працювати. Або, принаймні, це трапилося зі мною :)
Ste_95

Підтвердження того, що сказав @ Ste_95. Мені довелося поставити блок переписування HTTPS перед конфігурацією постійного посилання WP за замовчуванням.
Джастін Тілсон

1

Я виявив, що всі перелічені в цьому питанні рішення, на жаль, не працюють для мене. Що працювало:

# 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

Зауважте, що наведені вище правила Wordpress стосуються Wordpress у режимі багатокористувацької мережі. Якщо ваш Wordpress перебуває в режимі одного сайту, ви повинні використовувати:

# 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

Ніщо з перерахованого не працювало для мене. Але ці рядки вирішили ту саму проблему на моєму сайті WordPress:

RewriteEngine On

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

1

найпростіший спосіб перенаправити http на https у wordpress, змінити site_url та home з http://example.com на https://example.com . Wordpress зробить переспрямування. (саме тому ви отримуєте помилку "занадто багато переспрямувань", wordpress перенаправляє на http, тоді як .htaccess переспрямовує на https)


Я не впевнений, що це робить будь-яке перенаправлення для SEO :)
jcdarocha

1
впевнений, що так. переспрямування 301 (постійне), Google переіндексує
Рафаель

Майте на увазі, що це не працює з Google Search Console!
Гексод,

це буде працювати чудово .... wordpress зробить переспрямування (301). майте на увазі це: rtfm
Рафаель

0

Ось альтернативне рішення, яке ви можете використовувати, якщо не хочете редагувати .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();

        }

    }

}

Ви можете розмістити це внизу теми functions.php


Ще не зовсім впевнений, я думаю, він залишиться незмінним залежно від причини, з якої Google може індексувати його як версію HTTPS.
Вище кодування

0

Додайте це у файл .htaccess 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]

Тому файл .htaccess 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} ^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

Наведені вище остаточні .htaccess та тест A, B, C, D, E у мене не працювали. Я щойно використав код із 2 рядків, і він працює на моєму веб-сайті WordPress:

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

Я не впевнений, де я зробив помилку, але ця сторінка мені допомогла.


0

Жодного, якщо це спрацювало для мене. Перш за все мені довелося подивитися на свого постачальника, щоб побачити, як вони активують SSL у .htaccessмоєму постачальнику

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

Але що зайняло у мене кілька днів дослідження, мені довелося додати до wp-config.phpнаступних рядків, оскільки мій наданий сайт стоїть за проксі:

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

0

Просто додайте або замініть цей код у файлі .htaccess у 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

Перенаправлення з http на https: // www

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

Це точно спрацює!


-1

Просто додайте цей код, і він буде працювати як шарм:

<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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.