Как вы перенаправляете HTTPS в HTTP?

166

Как вы перенаправляете HTTPS в HTTP? То есть противоположность тому, что (кажется) каждый учит.

У меня есть сервер на HTTPS, за который я заплатил сертификацию SSL, и зеркало, для которого я не имею и держу его под рукой только для экстренных случаев, поэтому не стоит получать сертификацию.

На рабочих столах моего клиента у меня есть НЕКОТОРЫЕ ярлыки, которые указывают на http://production_serverи https://production_server(оба работают). Однако я знаю, что если мой https://mirror_serverрабочий сервер выйдет из строя , то переадресация DNS включится, и те клиенты, у которых есть ярлык «https», будут смотреть (что не работает) и большой толстый красный экран беспокойства Internet Explorer 7 для моей компании.

К сожалению, я не могу просто переключить это на уровне клиента. Эти пользователи очень неграмотны в компьютерах: и очень вероятно, что они увидят ошибки "небезопасности" HTTPS (особенно то, как Firefox 3 и Internet Explorer 7 в настоящее время обрабатывают это: полная остановка, к счастью, но не помогает мне здесь, LOL).

Это очень легко найти решения Apache для HTTP-> HTTPS Перенаправление , но для жизни меня я не могу сделать наоборот.

Идеи?

mauriciopastrana
источник
2
Не делай этого ! Перенаправления HTTPS из HTTP чрезвычайно опасны (и на самом деле скоро будут заблокированы всеми браузерами из-за злоупотребления), особенно если это узел через состояние HTTP без вывода сообщений (но то же самое верно, если это делается с помощью javascript), кроме случаев, когда: - (1) есть временная страница парковки HTTPS, предлагающая пользователям перейти по ссылке, активно щелкая по ней; или: - (2) HTTPS перенаправляет на HTTP точно в ТО ЖЕ домен, И перенаправления не изменяют запрошенный тип контента. Разрешение этого в браузерах позволило многим вредоносным программам пройти изоляцию. Такие перенаправления очень обманчивы.
verdy_p
4
Это похоже на внутренний сайт, где OP знает, что с ним происходит, и, следовательно, не опасно ... Если бы это был веб-сервер, я бы с вами согласился, но внутренний, только локальный веб-сервер, перенаправление в эта мода не будет проблемой.
Stese
@verdy_p Я работаю над переадресацией HTTPS на HTTP 302, случай с захваченными порталами. Можете ли вы указать мне документацию, на которую вы ссылаетесь?
jprusakova
Для вашего встроенного портала никогда не выполняйте перенаправление HTTPS на HTTP 302, за исключением случаев, когда он находится в том же домене (даже не в поддомене). А поскольку существует высокий риск раскрытия информации, остерегайтесь жетонов сеансов и файлов cookie, которые прозрачно передаются при перенаправлении! Вы должны знать, что цели HTTP могут быть подстроены, а информация взята прозрачными вредоносными прокси-серверами и даже вредоносными DNS: ваш клиент может даже не знать, что ваша цель только для HTTP будет недоступна и фактически перейдет в черный список! Поэтому никогда не делайте этого на HTTPS-ссылках, которые содержат частную сессию / куки / запросы.
verdy_p
Такое перенаправление HTTPS 302 всегда является дырой в безопасности вашего сайта HTTPS. Огромный риск - кража сессий и сбор личных аккаунтов ваших аутентифицированных пользователей. И в любом случае, НИКОГДА не делайте таких перенаправлений для загрузки javascripts или активных мультимедиа: это открытая дверь в сфере HTTPS «песочница». Действительно подумайте о том, чтобы сделать что-то обратное: перенаправить HTTP на HTTPS (особенно ваш главный портал или статические публичные страницы, которым не нужны личные данные / сеансы / куки) и использовать HTTPS для everelse. Если вам когда-нибудь понадобится перейти с HTTPS на HTTP, используйте стандартные ссылки (в разных запросах)
verdy_p

Ответы:

128

Это не было проверено, но я думаю, что это должно работать с использованием mod_rewrite

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}
ejunker
источник
1
Как мне заставить его работать (что мне нужно изменить с этого кода на мой домен, чтобы этот код работал)?
Enve
1
Enve: Просто добавьте в конфигурацию вашего сайта vhost_ssl.conf (или .htaccess в корне сайта). Ничего не нужно менять, он будет динамически использовать одно и то же имя хоста и URL-адрес.
Даррен Фелтон
1
Я думаю, что вы также можете поймать строки запроса. Я не уверен, но я думаю, что приведенный выше фрагмент не будет пересылать строки запроса из https в http.
Руставоре
12
Как указал Кирон ниже, это не будет работать, если у зеркального сервера нет действующего сертификата. Вы все равно увидите большое красное предупреждение из-за неверного сертификата. Как только вы начинаете использовать https, вы в основном застряли с ним. Будьте готовы платить за это всю оставшуюся жизнь. Если вы перестанете платить, люди, добавившие в закладки ссылки https, не смогут пройти.
Стивен Ченг
2
Платить за всю оставшуюся жизнь? Вы все еще можете использовать HTTPS, но смените провайдера PKI и получите новые более дешевые сертификаты. Да, вы все равно заплатите несколько долларов, но то же самое относится и к вашему доменному имени и вашему хостингу! Сертификат PKI теперь НЕ дорогой по сравнению с доменными именами и незначителен по сравнению с затратами на хостинг / пропускную способность!
verdy_p
71

Имейте в виду, что механизм перезаписи включается только после получения HTTP-запроса - это означает, что вам все равно понадобится сертификат, чтобы клиент мог установить соединение для отправки запроса!

Однако если машина резервного копирования будет иметь одно и то же имя хоста (в отношении клиента), то не должно быть никаких причин, по которым вы не можете использовать тот же сертификат, что и основной рабочий компьютер.

Кирон
источник
1
Как можно преодолеть это ограничение? У меня та же проблема. получение ошибки сертификата из браузера перед перенаправлением.
Сандип Балагопал
Было бы неплохо иметь перенаправление назад на HTTP, если есть ошибка сертификата
Джеффри Жираф
Это полностью побеждает цель иметь HTTPS в первую очередь
FluffyBeing
12

Исходя из ответа ejunker, это решение работает для меня не на одном сервере, а в облачной среде

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{ENV:HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
antoniom
источник
Использование 301 может быть мало опасным. 301 означает постоянное удаление, и я думаю, что переход от https к http временно. Посмотрите этот принятый ответ, чтобы узнать, какие минусы будут для пользователей stackoverflow.com/questions/1393280/…
yusuf tezel
Постоянное / временное различие 301/302 относится только к поисковым системам.
matthewv789
9

Для тех, кто использует .confфайл.

<VirtualHost *:443>
    ServerName domain.com
    RewriteEngine On
    RewriteCond %{HTTPS} on
    RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/domain.crt
    SSLCertificateKeyFile /etc/apache2/ssl/domain.key
    SSLCACertificateFile /etc/apache2/ssl/domain.crt

</VirtualHost>
стог
источник
8

Если ни одно из вышеуказанных решений не работает для вас (они не для меня), вот что сработало на моем сервере:

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]
rg88
источник
6
Часто вы не захотите L,(что означает «Последнее правило»). Если вы используете WordPress или другую CMS, Lфлаг может помешать правильной маршрутизации запроса страницы. Вместо этого используйте:RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301]
Руставоре
5

все вышеперечисленное не работало, когда я использовал cloudflare, этот работал для меня:

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

и этот определенно работает без прокси в пути:

RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
mikulabc
источник
3

Лучше избегать использования mod_rewrite, когда вы можете.

В вашем случае я бы заменил переписать на это:

    <If "%{HTTPS} == 'on'" >
            Redirect permanent / http://production_server/
    </If>

<If>Директива доступна только в Apache 2.4+ , как в этом блоге здесь .

sys0dm1n
источник
В размещенной среде, можно проверить версию Apache с помощью/usr/sbin/httpd -v
Serge Stroobandt
1

это работает для меня.

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
    Redirect "https://www.example.com/" "http://www.example.com/"
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    # ... 
</VirtualHost>

обязательно прослушайте оба порта 80 и 443.

jaxarroyo
источник
0

Ни один из ответов не работает для меня на веб-сайте Wordpress, но следующие работы (это похоже на другие ответы, но есть небольшие изменения)

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Yuseferi
источник
Не используйте такие правила вслепую со всеми REQUEST_URI (это не следует использовать, если в URI есть какие-либо данные формы или идентификаторы файлов cookie / сеансов в метаданных запроса). Используйте его только для статических общедоступных страниц / изображений. Избегайте его полностью для javascripts или активных компонентов (особенно для видеопотоков со скриптами или активных PDF-файлов, если они не подписаны вами цифровой подписью! По-прежнему невозможно цифровую подпись javascript-скриптов, сохраняйте их только в безопасном домене).
verdy_p
Примечание: некоторые форматы изображений активны и доступны для сценариев: например, остерегайтесь SVG. Мы видели атаки на некоторые HTTPS-сайты, загружающие изображения SVG из HTTP (с 302 перенаправлениями сайта), и собираемые вредоносными программами, вставляющими сценарии в содержимое SVG ... В идеале браузеры должны изолировать HTTP-содержимое от HTTPS и поместить его в песочницу (так что CORS также должны применяться ограничения безопасности, даже если они находятся в одном доменном имени ...), поэтому "http: // (домен) / ..." и "https: // (домен) /" следует рассматривать как отдельные домены для CORS (не одного источника), даже если они находятся на одном и том же номере порта TCP.
verdy_p
@verdy_p, что именно вы подразумеваете под "с 302 редиректами сайта"? Сначала вы должны владеть серверным сайтом (или узлами-участниками на уровне TCP / IP, такими как DNS-серверы, маршрутизаторы), чтобы использовать эти запросы HTTP-ресурсов, верно?
СЗ
Не обязательно. HTTPS в домене будет безопасным, в то время как HTTP в том же домене не будет (эксплойты не требуют управления IP-адресами, маршрутизаторами или DNS-серверами даже при использовании DNSSEC; эксплойты могут просто использовать IP-спуфинг, который невозможно безопасно обнаружить без включения HTTPS в безопасные сессии). Поэтому я утверждаю, что на сайте HTTPS должны размещаться изображения (даже в одном и том же домене), не обслуживая их по HTTP (по умолчанию это даже запрещено в некоторых браузерах, которые требуют щелчка активации или маскируют эти небезопасные изображения). Смешанный HTTPS / HTTP должен быть забанен: сайт может быть атакован по своим HTTP-частям (например, отслеживать пиксели).
verdy_p
-6

Насколько я знаю, простое обновление метаданных также работает без ошибок:

<meta http-equiv="refresh" content="0;URL='http://www.yourdomain.com/path'">
RobinUS2
источник
12
Я бы хотел, чтобы избиратели, находящиеся в проигрыше, должны были оставлять комментарии с объяснением причин, по которым проголосовали против. Лично я не выбрал бы этот ответ, если у вас как разработчика нет доступа к серверу, для которого вы разрабатываете, но у вас есть доступ к странице. Одна из проблем заключается в том, что вам придется жестко задавать каждый путь на каждой странице, чтобы это работало. Если вы можете предположить, что JavaScript включен для ваших важных вариантов использования, вам лучше использовать JavaScript, чтобы перейти на http. Приведенные выше ответы лучше, потому что они не требуют JavaScript, поскольку они происходят на сервере.
Руставоре
2
Просто: потому что htaccess - гораздо лучший вариант, чем этот. Кроме того, это не решит проблему перенаправления протокола https на http, если у вас нет сертификата.
Midudev
1
Действие должно обрабатываться сервером, а не документом «a», который он может обслуживать.
albal