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

124

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

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

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

К сожалению, я не могу просто переключить это на уровне клиента. Эти пользователи очень неграмотны в компьютерах: и, скорее всего, они увидят ошибки HTTPS "незащищенности" (особенно то, как Firefox 3 и Internet Explorer 7 обрабатывают ее в настоящее время: ПОЛНОСТЬЮ ОСТАНОВИТЬ, к счастью, но не помогая мне здесь LOL).

Это очень легко найти Apache solutions для http- > https redirection, но для жизни меня я не может сделать обратное.

Идеи?

  • 1
    Не делай этого ! Перенаправления HTTPS из HTTP чрезвычайно опасны (и на самом деле скоро будут заблокированы всеми браузерами из-за злоупотребления), особенно если это узел через состояние HTTP без вывода сообщений (но то же самое верно, если это делается с помощью javascript), кроме случаев, когда: - (1) есть временная страница парковки HTTPS, предлагающая пользователям перейти по ссылке, активно щелкая по ней; или: - (2) HTTPS перенаправляет на HTTP точно в ТО ЖЕ домен, И перенаправления не изменяют запрошенный тип контента. Разрешение этого в браузерах позволило многим вредоносным программам пройти изоляцию. Такие перенаправления очень обманчивы.
  • 2
    Это похоже на внутренний сайт, где OP знает, что с ним происходит, и, следовательно, не опасно ... Если бы это был веб-сервер, я бы с вами согласился, но внутренний, только локальный веб-сервер, перенаправление в эта мода не будет проблемой.
Показать ещё 3 комментария
Теги:
ssl
redirect
https

9 ответов

103
Лучший ответ

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

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}
  • 1
    Как мне заставить его работать (что мне нужно изменить с этого кода на мой домен, чтобы этот код работал)?
  • 1
    Enve: просто добавьте в конфигурацию vhost_ssl.conf вашего сайта (или .htaccess в корне сайта). Ничего не нужно менять, он будет динамически использовать одно и то же имя хоста и URL-адрес.
Показать ещё 9 комментариев
61

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

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

  • 1
    Как можно преодолеть это ограничение? У меня та же проблема. получение ошибки сертификата из браузера перед перенаправлением.
  • 0
    Было бы неплохо иметь перенаправление назад на HTTP, если есть ошибка сертификата
Показать ещё 1 комментарий
11

На основе ответа ejunker это решение работает для меня, а не на одном сервере, но в среде облако

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{ENV:HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
5

Для тех, кто использует файл .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>
4

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

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

все вышеизложенное не работало, когда я использовал 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]
1

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

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

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

0

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню