Я намагаюся перенаправити всі небезпечні запити HTTP на своєму сайті (наприклад http://www.example.com
) на HTTPS ( https://www.example.com
). Я використовую PHP btw. Чи можу я це зробити у .htaccess?
http://
Я намагаюся перенаправити всі небезпечні запити HTTP на своєму сайті (наприклад http://www.example.com
) на HTTPS ( https://www.example.com
). Я використовую PHP btw. Чи можу я це зробити у .htaccess?
http://
Відповіді:
Оновлення: Хоча ця відповідь була прийнята кілька років тому, зауважте, що її підхід зараз рекомендується проти документації Apache. Використовуйте Redirect
замість цього. Дивіться цю відповідь .
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
http://server/foo?email=someone%40example.com
переадресація на https://server/foo?email=someone%2540example.com
знак "@" отримує котирування URL-адреси двічі . Використання методу у відповіді @ ssc не має цього питання.
In the case of the http-to-https redirection, the use of RewriteRule would be appropriate if you don't have access to the main server configuration file, and are obliged to perform this task in a .htaccess file instead.
Документи Apache рекомендують не використовувати перезапис:
Щоб перенаправити
http
URL-адресиhttps
, виконайте наступне:<VirtualHost *:80> ServerName www.example.com Redirect / https://www.example.com/ </VirtualHost> <VirtualHost *:443> ServerName www.example.com # ... SSL configuration goes here </VirtualHost>
Цей фрагмент повинен входити в основний файл конфігурації сервера, а не в .htaccess
запитання в запитанні.
Ця стаття, можливо, з’явиться лише після того, як було задано і відповіли на питання, але, здається, це теперішній шлях.
permanent
ключове слово, ефект такий же (браузер отримує переспрямування 301). Напр .:Redirect permanent "/" "https://example.com"
Я б рекомендував переадресацію 301:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
[L]
Як я вже говорив у цьому запитанні , я пропоную вам уникати перенаправлення всіх HTTP-запитів до їх HTTPS-еквівалента наосліп, оскільки це може викликати у вас помилкове враження безпеки. Натомість, ви, ймовірно, повинні перенаправити "корінь" вашого HTTP-сайту до кореня вашого HTTPS-сайту та посилатися звідти лише на HTTPS.
Проблема полягає в тому, що якщо якесь посилання або форма на веб-сайті HTTPS змушує клієнта відправити запит на сайт HTTP, його вміст буде видно перед перенаправленням.
Наприклад, якщо одна з ваших сторінок, що <form action="http://example.com/doSomething">
надсилається через HTTPS, має форму, яка повідомляє та надсилає деякі дані, які не слід надсилати чітко, браузер спочатку надішле повний запит (включаючи сутність, якщо це POST) на HTTP-сайт перший. Перенаправлення буде відправлено негайно до браузера, і оскільки велика кількість користувачів відключає або ігнорує попередження, ймовірно, воно буде проігноровано.
Звичайно, помилка в наданні посилань, які мають бути на сайті HTTPS, але в кінцевому підсумку є для HTTP-сайту, може спричинити проблеми, як тільки ви отримаєте щось прослуховування на порту HTTP на тій же IP-адресі, що і ваш HTTPS-сайт. Однак я вважаю, що зберігання двох сайтів як "дзеркала" лише збільшує шанси помилитися, оскільки, можливо, ви можете зробити припущення, що воно автоматично виправить себе, перенаправляючи користувача на HTTPS, тоді як часто це вже пізно. (У цьому питанні були подібні дискусії . )
Я дізнався, що найкращий спосіб для https та www у домені - це
RewriteCond %{HTTPS} off
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
http://www.example.com/...
оскільки дві умови неявно AND AND'd. Натомість вони повинні бути АБО, тобто. включіть OR
прапор на першу умову (і не забудьте уникнути буквальних крапок у регулярному виразі). Але якщо ви реалізуєте HSTS, тоді ви не хочете переспрямовувати на HTTPS та www в одному переадресуванні, спершу слід перенаправитись на HTTPS .
Це підхід до переадресації HTML, який працює, але не найкращий.
<meta http-equiv="Refresh" content="0;URL=https://www.example.com" />
PHP підхід
<?php
function redirectTohttps() {
if ($_SERVER['HTTPS']!="on") {
$redirect= "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
header("Location:$redirect");
}
}
?>
.htaccess Approch
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
скопійовано з: www.letuslook.org
.htaccess
йде? Крім того, це посилання є мертвим.
Мені подобається цей спосіб перенаправлення з http на https. Тому що мені не потрібно редагувати його для кожного сайту.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Використовуючи такий код у файлі .htaccess, автоматично переспрямовує відвідувачів до HTTPS-версії вашого сайту:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Якщо у вас є файл .htaccess:
Не дублюйте RewriteEngine On.
Переконайтесь, що рядки, що починаються з RewriteCond та RewriteRule, негайно слідують за вже існуючим RewriteEngine On.
Це правильний метод перенаправлення HTTP на HTTPS з використанням .htaccess за даними GoDaddy.com. Перший рядок коду - неясний. Другий рядок коду перевіряє, чи HTTPS вимкнено, і якщо так, то він перенаправляє HTTP на HTTPS шляхом запуску третього рядка коду, інакше третій рядок коду ігнорується.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
https://www.godaddy.com/help/redirect-http-to-https-automatically-8828
Найкраще рішення залежить від ваших вимог. Це підсумок раніше опублікованих відповідей із доданим контекстом.
Якщо ви працюєте з веб-сервером Apache і можете змінити його конфігурацію, дотримуйтесь документації Apache :
<VirtualHost *:80>
ServerName www.example.com
Redirect "/" "https://www.example.com/"
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
# ... SSL configuration goes here
</VirtualHost>
Але ви також запитали, чи можете ви це зробити у .htaccess
файлі. У такому випадку ви можете використовувати RewriteEngine Apache :
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
Якщо все працює нормально і ви хочете, щоб браузери запам'ятали це переспрямування, ви можете оголосити його як постійне, змінивши останній рядок на:
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Але будьте обережні, якщо ви можете змінити свою думку щодо цього переадресації. Веб-переглядачі пам’ятають це дуже давно і не перевірять, чи він змінився.
Можливо, вам не знадобиться перший рядок RewriteEngine On
залежності від конфігурації веб-сервера.
Якщо ви шукаєте рішення PHP, подивіться на масив $ _SERVER та функцію заголовка :
if (!$_SERVER['HTTPS']) {
header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
}
.htaccess
файлі?
Додайте наступний код у файл .htaccess:
Options +SymLinksIfOwnerMatch
RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^ https://[your domain name]%{REQUEST_URI} [R,L]
Де [ваше доменне ім’я] - доменне ім’я вашого веб-сайту.
Ви також можете перенаправляти конкретні папки зі свого доменного імені, замінюючи останній рядок коду вище на:
RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L]
Зробіть все, що описано вище для перенаправлення. Просто додайте до заголовка "Сувора безпека транспорту HTTP". Це дозволить уникнути людини в середині нападу.
Відредагуйте файл конфігурації apache (наприклад, /etc/apache2/sites-enabled/website.conf та /etc/apache2/httpd.conf) та додайте у свою VirtualHost наступне:
# Optionally load the headers module:
LoadModule headers_module modules/mod_headers.so
<VirtualHost 67.89.123.45:443>
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>
https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
Щоб перенаправити всі http
запити на https
, ви можете використовувати:
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]
Якщо модуль перезапису не ввімкнено, і ви перебуваєте на апаш 2.4, ви також можете використовувати Redirect
внутрішню if
директиву для переадресації http
запитів наhttps
.
Apache 2.4.
<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
Якщо ви потрапили в ситуацію, коли ви не можете отримати доступ до конфігурації apache безпосередньо для вашого сайту, який у багатьох розміщених платформах досі обмежений таким чином, я б фактично рекомендував двоступеневий підхід. Причина, по якій самі Apache документують, що ви повинні використовувати їх параметри конфігурації насамперед через mod_rewrite для HTTP до HTTPS.
По-перше, як було сказано вище, ви встановите свої правила .htaccess mod_rewrite:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Потім у ваших PHP-файлах (вам потрібно зробити це там, де це було б відповідно до вашої ситуації, деякі сайти будуть послідовно виконувати всі запити через один PHP-файл, інші обслуговують різні сторінки залежно від їх потреб та запиту, що робиться. ):
<?php if ($_SERVER['HTTPS'] != 'on') { exit(1); } ?>
Вищезазначене потрібно запустити ПЕРЕД будь-яким кодом, який може потенційно виявити захищені дані в незахищеному середовищі. Таким чином, ваш веб-сайт використовує автоматичне перенаправлення через HTACCESS та mod_rewrite, тоді як ваш сценарій (и) забезпечують, щоб вихід не був наданий, коли до нього не звертаються через HTTPS.
Я думаю, більшість людей не думають так, і тому Apache рекомендує не використовувати цей метод там, де це можливо. Однак це просто потребує додаткової перевірки кінця розробки, щоб гарантувати безпеку даних користувача. Сподіваємось, це допоможе комусь, кому, можливо, доведеться використовувати нерекомендовані методи через обмеження в нашому хостингу.
Через .htaccess Це допоможе.
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
Також див. Це детальніше. Як перенаправити HTTP на Https?
Якщо вам не потрібен mod_rewrite для інших речей, використання основної директиви IF Apache є чистішим та швидшим:
<If "%{HTTPS} == 'off'">
Redirect permanent / https://yoursite.com/
</If>
Ви можете додати більше умов до директиви IF, наприклад, забезпечити єдиний канонічний домен без префіксу www:
<If "req('Host') != 'myonetruesite.com' || %{HTTPS} == 'off'">
Redirect permanent / https://myonetruesite.com/
</If>
Існує велика інертність знайомства з використанням mod_rewrite для всього, але подивіться, чи це працює для вас.
Більше інформації: https://httpd.apache.org/docs/2.4/mod/core.html#if
Щоб побачити його в дії (спробуйте без www. Або https: // або з .net замість .com): https://nohodental.com/ (веб-сайт, над яким я працюю).
прийняти цей код до вас .htaccess файл автоматично перенаправляє HTTP на HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Я знайшов спосіб змусити всі сторінки мого сайту переадресувати з http на аналог сторінок на https, які працюють для мене.
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Це перенаправляє всі URL-адреси на https та www
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC,OR]
RewriteCond %{HTTP_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
Якщо ви хочете зробити це з сервера tomcat, виконайте наведені нижче дії
Як самостійно налаштувати HTTP-сервер Apache Tomcat (8.5.x) на сервері Apache Tomcat (8.5.x), якщо користувач введе www.domain.com, вони будуть автоматично переслані на сайт https (www.domain.com).
Двоетапний метод включення наступного у ваш [Tomcat_base] /conf/web.xml перед тегом закриття
step 1:
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOnly</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
та встановлення параметрів роз'єму [Tomcat_base] /conf/server.xml:
step 2:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="443"/>
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="[keystorelocation]" type="RSA" />
</SSLHostConfig>
</Connector>
Примітка. Якщо ви вже зробили конфігурацію https та намагаєтесь переспрямувати лише кроки 1.
Якщо ви використовуєте Apache, mod_rewrite є найпростішим рішенням, і в ньому є багато документації в Інтернеті, як це зробити. Наприклад: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html
Інша проблема цієї проблеми полягає в тому, коли балансує навантажувальний балансир.
Ситуація така: - Трафік від браузера до завантажувального балансира та назад, є (повинен бути) HTTPS - трафік між балансиром навантаження та фактичним веб-сервером - це HTTP.
Отже, всі змінні серверного запиту в PHP або Apache показують, що з'єднання - це лише HTTP. І каталоги HTTP і HTTPS на сервері однакові.
RewriteCondition у затвердженій відповіді не працює. Він дає цикл або просто не працює.
Питання: Як змусити це працювати над балансиром навантаження.
(Або налаштовано балансир завантаження неправильно. На що я сподіваюся, тому що тоді я можу перенести проблему на компанію WebHosting :-))
Якщо ви використовуєте еластичний балансир завантаження Amazon Web Services, який приймає трафік https та спрямовує його на ваш сервер (и) за допомогою http, тут описаний правильний спосіб перенаправити весь http-трафік на https: https://aws.amazon. com / premiumsupport / центр знань / перенаправлення-http-https-elb
Використовуйте заголовок X-Forwarded-Proto (містить http або https), який завжди входить у запити http від балансира навантаження, як описано тут: https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x- forwarded-headers.html
У файлі httpd.conf:
<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
</VirtualHost>
Або у вашому кореневому файлі .htaccess:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
Бонус: він не намагатиметься перенаправляти http-трафік на локальній машині розвитку.
Це працює для мене:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
і, наприклад, http: // server / foo? email = хтось% 40example.com перенаправляє звичайно без проблем. Файл .htaccess розташований у кореневій папці веб-сайту (наприклад, з ім'ям public_html). Можна використовувати RewriteCond% {SERVER_PORT}! ^ 443 $ замість RewriteCond% {HTTPS}! On
httpd
, а не з PHP.