.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

Ответы:


117

Обновление 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
рад, что это сработало для вас. проверьте обновленный ответ для объяснения кода. Вам этого достаточно?
Jojo

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]вместо него.
Jānis Elmeris

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
это более уместно, чем принятый "
хакерский

7
В некоторых случаях требуется X-Forwarded-Proto RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
Кузеко

1
безусловно, лучший ответ здесь
skrilled

Это сработало для меня на сервере Godaddy. @Bradley Отлично !!
Вишну

У меня это каждый раз срабатывало при различных серверных средах и настройках сайтов. Должен быть рекомендуемый ответ ИМХО.
Джон Контарино

60

Это лучший wwwвариант для HTTPS, для пользователей прокси и без прокси.

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

это, безусловно, лучший ответ для тех, кого %{HTTPS} offнедостаточно
NoodleOfDeath

10

Я заставляю https использовать следующий код:

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

1
@Niby, пожалуйста, проверьте дату моего ответа и "тот, который уже есть".
Arda

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. Если вы отредактируете свой ответ этим, я с радостью сделаю ссылку на здесь из принятого ответа
Jojo

Привет, Джоджо! извините за столь поздний ответ, вы имеете в виду удаление как # <IfModule mod_headers.c>и # </IfModule>линии?
LIIT

привет ЛИИТ, да, я имел в виду именно это.
Jojo

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
Пожалуйста, не публикуйте только код в качестве ответа, но также объясните, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением обычно более полезны и качественнее, и с большей вероятностью получат положительные отзывы.
Марк Роттевил,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.