.htaccess перенаправляє http на https


86

У мене є стара URL-адреса ( www1.test.net), і я хотів би перенаправити її на те, що https://www1.test.net
я впровадив і встановив наш SSL-сертифікат на своєму сайті.
Це мій старий файл.htaccess :

RewriteEngine On
RewriteRule !\.(js|gif|jpg|png|css|txt)$ public/index.php [L]
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ public/$1 [L]

Як я можу налаштувати свій .htaccessфайл так, щоб URL-адреса автоматично перенаправляла на https?
Дякую!


Якщо другий рядок не призначений для переспрямування, якщо шлях вказує на фактичний файл (і ви перелічуєте очікувані можливі розширення), ви можете зробити його більш гнучким, замінивши його на перевірку для наявного файлу: RewriteCond %{REQUEST_FILENAME} !-f після чого переспрямування.
diamondsea

Відповіді:


118

Оновлення 2016 року

Оскільки цій відповіді приділяється певна увага, я хочу натякнути на більш рекомендований спосіб зробити це за допомогою віртуальних хостів: Apache: Redirect SSL

<VirtualHost *:80>
   ServerName mysite.example.com
   Redirect permanent / https://mysite.example.com/
</VirtualHost>

<VirtualHost _default_:443>
   ServerName mysite.example.com
   DocumentRoot /usr/local/apache2/htdocs
   SSLEngine On
# etc...
</VirtualHost>

Стара відповідь, хакі, якщо для вашого ssl-порту не встановлено значення 80, це спрацює:

RewriteEngine on

# force ssl
RewriteCond     %{SERVER_PORT} ^80$
RewriteRule     ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

Зверніть увагу, що це повинно бути вашим першим правилом перезапису.

Редагувати: Цей код робить наступне. RewriteCond (ition) перевіряє, чи є ServerPort запиту рівним 80 (що є типовим http-портом за замовчуванням, якщо ви вказали інший порт, вам доведеться підлаштовувати стан до нього). Якщо так, ми збігаємо цілу URL-адресу (.*)та перенаправляємо її на https-url. %{SERVER_NAME}може бути замінено на конкретну URL-адресу, але таким чином вам не доведеться змінювати код для інших проектів. %{REQUEST_URI}- це частина URL-адреси після TLD (домен верхнього рівня), тому вас буде перенаправлено туди, звідки ви прийшли, але як https.


1
Дякую, дякую ... це працює ...: D Але, чи можете ви пояснити, чому це працює? ... дякую ... ^^
Bàn Chân Trần

1
рада, що це спрацювало для вас. перевірте оновлену відповідь для пояснення щодо коду. Вам цього достатньо?
Джоджо

1
"Зауважте, що це має бути першим правилом переписування." @Jojo Врятував моє життя, людина: *
Іван Шулев

1
Додати до пояснення. "[Прапор [L]] ( httpd.apache.org/docs/2.4/rewrite/flags.html#flag_l ) змушує mod_rewrite зупинити обробку набору правил." Зазвичай ви хочете просто додати це за замовчуванням. "Використання [прапора [R]] ( httpd.apache.org/docs/2.4/rewrite/flags.html#flag_r ) призводить до того, що браузеру видається переадресація HTTP." Якщо його немає, переспрямування буде внутрішнім, що призведе до втрати сенсу використання HTTPS. За замовчуванням виданий редирект має статус 302 (тимчасове редирект). Якщо ви хочете, щоб браузер ("назавжди") кешував нову URL-адресу, використовуйте її [R=301].
Яніс Елмеріс

1
Що стосується рішення VirtualHost, незрозуміло, куди слід помістити оператор "Перенаправити постійний" у разі складної настройки. Я припустив біля вершини, і це спрацювало.
eyal_katz

178

Я використовую наступне, щоб успішно перенаправити всі сторінки свого домену з http на https:

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

Зверніть увагу, що це переспрямування використовуватиме 301 'permanently moved'переспрямування, яке допоможе перенести ваші рейтинги SEO.

Для переспрямування за допомогою 302 'temporarily moved'зміни[R=302,L]


5
це більш доречно, ніж прийнята відповідь "хакі"
am05mhz

7
У деяких випадках потрібен X-Forwarded-Proto RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
Кузеко,

1
набагато краща відповідь тут
прокручений

Це працює для мене на сервері Godaddy. @Bradley Чудово !!
вішну

Це щоразу працювало для мене в різних серверних середовищах та налаштуваннях сайту. Повинна бути рекомендована відповідь ІМХО.
Джон Контаріно,

60

Це найкраще для wwwHTTPS та для нього, для користувачів проксі-серверів та інших користувачів.

RewriteEngine On

### WWW & HTTPS

# ensure www.
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

### WWW & HTTPS

1
як перенаправити на не-www?
Еліор,

це, безумовно, найкраща відповідь для тих, кого %{HTTPS} offнедостатньо
NoodleOfDeath

10

Я нав'язую https наступним кодом:

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

1
@Niby перевірте дату моєї відповіді та "ту, яка вже є", будь ласка.
Арда,

6

У випадках, коли підключення HTTPS / SSL закінчується на балансаторі навантаження і весь трафік надсилається екземплярам на порт 80, наступне правило працює для перенаправлення незахищеного трафіку.

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Переконайтеся, що mod_rewriteмодуль завантажений.


4

Шукаючи найкращого способу переспрямування, я знайшов це (походить від html5boilerplate):

# ----------------------------------------------------------------------
# | HTTP Strict Transport Security (HSTS)                              |
# ----------------------------------------------------------------------

# Force client-side SSL redirection.
#
# If a user types `example.com` in their browser, even if the server
# redirects them to the secure version of the website, that still leaves
# a window of opportunity (the initial HTTP connection) for an attacker
# to downgrade or redirect the request.
#
# The following header ensures that browser will ONLY connect to your
# server via HTTPS, regardless of what the users type in the browser's
# address bar.
#
# (!) Remove the `includeSubDomains` optional directive if the website's
# subdomains are not using HTTPS.
#
# http://www.html5rocks.com/en/tutorials/security/transport-layer-security/
# https://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14#section-6.1
# http://blogs.msdn.com/b/ieinternals/archive/2014/08/18/hsts-strict-transport-security-attacks-mitigations-deployment-https.aspx

Header set Strict-Transport-Security "max-age=16070400; includeSubDomains"

Можливо, це комусь допоможе у 2017 році! :)


У 2017 році це має бути прийнятою відповіддю. Але він повинен містити, що для увімкнення HSTS через файл .htacces (запитання позначене цим) ви повинні опустити теги IfModule. Якщо ви відредагуєте свою відповідь таким чином, я б із задоволенням посилався сюди із прийнятої відповіді
Джоджо

Привіт Джоджо! вибачте за цю пізню відповідь, ви маєте на увазі видалення обох # <IfModule mod_headers.c>і # </IfModule>рядків?
LIIT

Гей, БРІХ, так, це я мав на увазі.
Джоджо

1
Хоча це приємно і допомагає досягти або підтримати (ймовірно) бажаний ефект, це не перенаправляє http-запити на https і як таке не дає відповіді на запитання. Це працює лише в тому випадку, якщо клієнт вже отримав доступ до сайту через HTTPS (у межах максимального вікового інтервалу). Тож воно завжди повинно супроводжуватися належним перенаправленням.
Ніколай Ехманн,

4

Вставте цей код у файл .htaccess. І це має спрацювати

RewriteCond %{HTTP_HOST} yourDomainName\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://yourDomainName.com/$1 [R,L]

3

Додайте цей код в кінці вашого файлу .htaccess

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

1
Можливо тому, що mod_rewrite не включений у цій відповіді, як і в інших.
keji

Просто додавання RewriteEngine onдо верхньої частини цього змусить це працювати.
Giacomo1968

2

Додавши наступне у верхню частину .htaccess

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

2

Це гарантує, що переспрямування працюють для всіх комбінацій непрозорих проксі.

Сюди входить веб-сервер клієнта <http> проксі <https> .

# behind proxy
RewriteCond %{HTTP:X-FORWARDED-PROTO} ^http$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

# plain
RewriteCond %{HTTP:X-FORWARDED-PROTO} ^$
RewriteCond %{REQUEST_SCHEME} ^http$ [NC,OR]
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

1

У мене була проблема з переадресацією. Я спробував усе, що було запропоновано на Stackoverflow. Один випадок, який я знайшов сам:

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP:SSL} !=1 [NC]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

-1

Примусове використання HTTPS за допомогою .htaccessфайлу

==> Перенаправити весь веб-трафік: -

Щоб змусити весь веб-трафік використовувати HTTPS, вставте наступні рядки коду у .htaccessфайл у кореневій папці веб-сайту.

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

==> Домен лише для переспрямування: -

Щоб змусити певний домен використовувати HTTPS, використовуйте такі рядки коду у .htaccessфайлі в кореневій папці веб-сайту:

RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteEngine On 
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

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

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

Переконайтесь, що замінили example.com на доменне ім’я, яке ви намагаєтесь примусити зробити https. Крім того, вам потрібно замінити www.example.com на ваше справжнє доменне ім’я.

==> Перенаправлена ​​вказана папка: -

Якщо ви хочете застосувати SSL до певної папки, вставте наведений нижче код у .htaccessфайл, розміщений у цій конкретній папці:

RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} folder
RewriteRule ^(.*)$ https://www.example.com/folder/$1 [R=301,L]

Переконайтеся, що ви змінили посилання на папку на фактичне ім’я папки. Тоді не забудьте замінити www.example.com/folder вашим фактичним іменем домену та папкою, до якої потрібно примусити SSL.


-1

Замініть свій домен на domainname.com, він працює зі мною.

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

2
Будь ласка, не публікуйте лише код як відповідь, але також надайте пояснення, що робить ваш код і як він вирішує проблему питання. Відповіді з поясненнями, як правило, є більш корисними та якісними, і, швидше за все, залучають прихильників.
Mark Rotteveel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.