Як перенаправити HTTPS на HTTP?


166

Як перенаправити HTTPS на HTTP ?. Тобто, навпаки тому, чого (начебто) вчить кожен.

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

На робочих столах мого клієнта у мене є деякі ярлики , які вказують на http://production_serverі https://production_server(обидві роботи). Однак я знаю, що якщо мій сервер виробництва знизиться, тоді DNS-переадресація запускається, і ті клієнти, які мають "https" на своєму ярлику, будуть дивитись на https://mirror_server(який не працює) і великий жирний червоний екран Internet Explorer 7 від неприємностей для моєї компанії.

На жаль, я не можу просто змінити це на рівні клієнтів. Ці користувачі дуже неграмотні: і, швидше за все, вони не відчувають помилок HTTPS у «невпевненості» (особливо те, як Firefox 3 та Internet Explorer 7 справляються з цим у наш час: ПОЛІ СТОП, на щастя, але не допомагаю мені тут LOL).

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

Ідеї?


2
Не роби цього ! Переадресації HTTPS з HTTP надзвичайно небезпечні (і насправді вони будуть заблоковані всі браузерами незабаром через зловживання), особливо якщо це вузол через беззвучний HTTP-статус (але те ж саме, якщо це робиться за допомогою JavaScript), якщо тільки: (1) є тимчасова сторінка для паркування HTTPS, яка пропонує користувачам перейти посилання, натиснувши його активно; або: - (2) HTTPS переадресовує до HTTP на точно SAME домену і переадресовує не змінює тип вмісту запитували. Дозвіл у веб-переглядачах дозволив безлічі шкідливих програм пройти ізоляцію. Такі переадресації дуже оманливі.
verdy_p

4
Це виглядає як внутрішній сайт, де ОП знає, що з ним відбувається, і, отже, не небезпечно ... Якби це сервер, орієнтований на веб-сайт, я погодився б із вами, але внутрішній, лише локальний веб-сервер, перенаправлення в ця мода не буде проблемою.
Stese

@verdy_p Я працюю над перенаправленнями HTTPS до HTTP 302, у випадку з портами, що перебувають у полоні. Чи можете ви вказати мені документацію, на яку ви посилаєтесь?
jprusakova

Для вашого захопленого порталу ніколи не виконуйте перенаправлення HTTPS на HTTP 302, за винятком випадків, якщо це точно на той самий домен (навіть не піддомен). А оскільки існує високий ризик розкриття інформації, остерігайтесь, що маркер сесії та файли cookie пропускаються прозоро із перенаправленням! Ви повинні знати, що цілі HTTP можна налаштовувати, а інформацію отримувати через прозорі проксі-сервери та навіть зловмисні DNS: ваш custoer mayu навіть не знає, що ваша ціль, лише HTTP, буде недосяжна і насправді перейде на чорний! Тому ніколи не робіть цього на HTTPS-посиланнях, які містять приватні сеанси / файли cookie / запити.
verdy_p

Такі перенаправлення HTTPS 302 - це завжди дірка безпеки на вашому сайті HTTPS. Величезний ризик - це викрадення сеансів, а ваші аутентифіковані користувачі зібрали приватні акаунти. І в будь-якому випадку, НІКОЛИ не робіть таких переспрямувань для завантаження Java-скриптів чи активних мультимедіа: це відкриті двері у царині «пісочниці» HTTPS. Дійсно, подумайте зробити щось зворотне: перенаправляйте HTTP на HTTPS (особливо на ваш головний портал або статичні загальнодоступні сторінки, яким не потрібні приватні дані / сесії / файли cookie) і використовуйте HTTPS для everelse. Якщо вам коли-небудь потрібно дістатися з HTTPS до HTTP, використовуйте стандартні посилання (у різних запитах)
verdy_p

Відповіді:


128

Це не перевірено, але я думаю, що це має працювати, використовуючи mod_rewrite

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

1
Як змусити його працювати (що мені потрібно змінити з цього коду на мій домен, щоб цей код працював)?
Enve

1
Enve: Просто додайте до конфігурації vhost_ssl.conf вашого сайту (або .htaccess у корені сайту). Нічого не потрібно змінювати, воно буде динамічно використовувати те саме ім’я хосту та URL-адресу.
Даррен Фелтон

1
Я думаю, ви також можете захопити рядки запитів. Я не впевнений, але думаю, що вищевказаний фрагмент не буде пересилати рядки запиту від https до http.
Руставоре

12
Як вказав Кірон нижче, це не працює, якщо дзеркальний сервер не має дійсного сертифіката. Ви все ще побачите велике червоне попередження через недійсний сертифікат. Після того, як ви почнете використовувати https, ви в основному з цим застрягли. Будьте готові платити за це протягом усього життя. Якщо ви припините платити, люди, які взяли закладки на https-посилання, не зможуть зайти.
Стівен Чен

2
Платить за все життя? Ви все ще можете користуватися HTTPS, але змінити постачальника PKI та отримати нові більш дешеві сертифікати. Ви все одно заплатите кілька доларів так, але те саме стосується вашого доменного імені та вашого хостингу! Сертифікат PKI зараз НЕ дорогий у порівнянні з доменними іменами і є незначним порівняно з витратами на хостинг / пропускну здатність!
verdy_p

71

Майте на увазі, що двигун Rewrite запускається лише після отримання HTTP-запиту - це означає, що вам все одно знадобиться сертифікат, щоб клієнт встановив з'єднання для надсилання запиту!

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


1
Як це обмеження можна подолати? У мене те саме питання. отримання помилки сертифікату від браузера перед переадресацією.
Sandeep Balagopal

Було б непогано мати переспрямування назад на HTTP, якщо є помилка сертифіката
Jeffrey the Giraffe

Це повністю перемагає призначення HTTPS в першу чергу
FluffyBeing

12

Виходячи з відповіді ejunker, це рішення, яке працює для мене, не на одному сервері, а на хмарному оточенні

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

Використання 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]

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]

3

Краще уникати використання mod_rewrite, коли можна.

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

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

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


У розміщеному середовищі можна перевірити версію 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.


0

Жодна відповідь не працює для мене на веб-сайті Wordpress, але наступні роботи (це схоже на інші відповіді, але мають трохи змінити)

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

Не використовуйте такі правила наосліп з усіма REQUEST_URI (це не слід використовувати, якщо в URI є будь-які дані форми або ідентифікатори файлів cookie / сеансів у метаданих запиту). Використовуйте його лише для статичних загальнодоступних сторінок / зображень. Уникайте цього повністю для Java-скриптів чи активних компонентів (особливо відеозаписів, що проглядаються у форматі, чи активних PDF-файлів, якщо вони не підписані вами цифровим способом). Це все ще неможливо цифровим підписом javascripts, зберігайте їх лише у захищеному домені).
verdy_p

Примітка: деякі формати зображень є активними та написаними на екрані: будьте на увазі, наприклад, про SVG. Ми бачили напади на деякі веб-сайти HTTPS, які завантажують SVG-зображення із HTTP (із 302 переспрямуваннями сайту) та збирають шкідливі програми, вставляючи сценарії у вміст SVG ... В ідеалі браузери повинні ізолювати HTTP-підміси від HTTPS та розміщувати їх у пісочниці (тому CORS обмеження безпеки також повинні застосовуватися, навіть якщо вони в одному імені домену ...), тому "http: // (домен) / ..." та "https: // (домен) /" вважатимуться окремими доменами для CORS (не того самого походження), навіть якщо вони знаходяться на одному номері порту TCP.
verdy_p

@verdy_p, що саме ти маєш на увазі під "перенаправленнями сайту 302"? Вам потрібно спочатку володіти сайтом сервера (або вузлами учасників на рівні TCP / IP, як DNS-сервери, маршрутизатори), щоб використовувати цей запит HTTP-ресурсів, правда?
Sz.

Не обов'язково. 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'">

12
Я хотів би, щоб виборці повинні були залишити коментарі, що пояснюють причини відмови. Особисто я б не вибрав цю відповідь, якщо ви як розробник не мали доступу до сервера, для якого працювали, але у вас був доступ до сторінки. Одна з проблем полягає в тому, що вам доведеться жорстко кодувати кожен шлях на кожній сторінці, щоб це працювало. Якщо ви можете припустити, що JavaScript увімкнено для ваших важливих випадків використання, вам краще використовувати JavaScript для переходу на http. Наведені вище відповіді краще, оскільки вони не потребують JavaScript, оскільки вони відбуваються на сервері.
Руставоре

2
Просто: тому що htaccess - це набагато кращий варіант, ніж цей. Крім того, це не вирішить проблему перенаправити протокол https на http, якщо у вас немає сертифіката.
midudev

1
Дія повинна бути оброблена сервером, а не "a" документом, який він може обслуговувати.
albal
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.