Как заставить мой URL-адрес загружать https: // www? [Дубликат]

Это очень распространенная проблема, с которой мы сталкиваемся, борясь с «таинствами» JavaScript.

Давайте начнем с простой функции JavaScript:

function foo(){
// do something 
 return 'wohoo';
}

let bar = foo(); // bar is 'wohoo' here

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

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

function foo(){
 setTimeout( ()=>{
   return 'wohoo';
  }, 1000 )
}

let bar = foo() // bar is undefined here

Итак, вы идете, эта задержка просто сломала функциональность, которую мы ожидали! Но что именно произошло? Ну, на самом деле это довольно логично, если вы посмотрите на код. функция foo() после выполнения ничего не возвращает (таким образом, возвращаемое значение равно undefined), но оно запускает таймер, который выполняет функцию после 1s, чтобы вернуть «wohoo». Но, как вы можете видеть, значение, присвоенное бару, является немедленно возвращенным материалом из foo (), а не что-либо еще, что приходит позже.

Итак, как мы решаем эту проблему?

Давайте попросим нашу функцию для ОБЕЩАНИЯ. Обещание действительно о том, что это означает: это означает, что функция гарантирует, что вы предоставите любой результат, который он получит в будущем. поэтому давайте посмотрим на это в нашей маленькой проблеме выше:

function foo(){
   return new Promise( (resolve, reject) => { // I want foo() to PROMISE me something
    setTimeout ( function(){ 
      // promise is RESOLVED , when exececution reaches this line of code
       resolve('wohoo')// After 1 second, RESOLVE the promise with value 'wohoo'
    }, 1000 )
  })
}

let bar ; 
foo().then( res => {
 bar = res;
 console.log(bar) // will print 'wohoo'
});

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

238
задан Kate Gregory 4 December 2013 в 20:10
поделиться

19 ответов

Как я сказал в этом вопросе , я предлагаю вам избегать перенаправления всех HTTP-запросов на их HTTPS-эквивалент вслепую, так как это может вызвать ложное впечатление о безопасности. Вместо этого вы, вероятно, должны перенаправить «корень» вашего сайта HTTP на корень вашего сайта HTTPS и ссылку оттуда только на HTTPS.

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

Например, если одна из ваших страниц, обслуживаемая HTTPS, имеет форму, которая говорит <form action="http://example.com/doSomething">, и отправляет некоторые данные, которые не должны быть отправлены ясно, браузер сначала отправит полный запрос (включая объект, если это POST) на сайт HTTP. Перенаправление будет немедленно отправлено в браузер, и, поскольку большое количество пользователей отключает или игнорирует предупреждения, это, вероятно, будет проигнорировано.

Конечно, ошибка предоставления ссылок, которые должны быть связаны с Сайт HTTPS, но в конечном итоге для HTTP-сайта может вызвать проблемы, как только вы получите что-то прослушивание на HTTP-порту на том же IP-адресе, что и ваш сайт HTTPS. Тем не менее, я думаю, что сохранение двух сайтов в качестве «зеркала» только увеличивает шансы на ошибки, так как вы можете предположить, что он будет автоматически исправлять себя, перенаправляя пользователя на HTTPS, тогда как часто бывает слишком поздно. (Были аналогичные обсуждения в этом вопросе. )

238
ответ дан Community 5 September 2018 в 10:20
поделиться

Это правильный метод перенаправления 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

5
ответ дан AnarchyOutlaw 5 September 2018 в 10:20
поделиться

Другое преимущество этой проблемы - играть в балансировку нагрузки.

Ситуация такова: - Трафик от браузера до Load Balancer и обратно, это должен быть HTTPS. Трафик между Load Balancer и фактическим WebServer - это HTTP.

Итак, все переменные запроса сервера в PHP или Apache показывают, что соединение - это просто HTTP. И HTTP и HTTPS-каталоги на сервере одинаковы.

RewriteCondition в одобренном ответе не работает. Он дает либо цикл, либо просто не работает.

Вопрос: как заставить это работать с балансировщиком нагрузки.

(Или Балансировщик нагрузки настроен неправильно. На что я надеюсь, потому что тогда я могу переместить проблему в компанию WebHosting :-))

0
ответ дан BertC 5 September 2018 в 10:20
поделиться

Мне нравится этот метод перенаправления с http на https. Потому что мне не нужно редактировать его для каждого сайта.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
9
ответ дан Cory 5 September 2018 в 10:20
поделиться

Я бы рекомендовал с 301 переадресацией:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
109
ответ дан David 5 September 2018 в 10:20
поделиться

Если вы находитесь в ситуации, когда у вас нет доступа к конфигурации 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 рекомендует что вы не используете этот метод там, где это возможно. Однако для обеспечения безопасности данных пользователя требуется дополнительная проверка на конец разработки. Надеюсь, это поможет кому-то еще, кому, возможно, придется заглянуть в использование не рекомендованных методов из-за ограничений на конец нашего хостинга.

2
ответ дан F. Scott Gale 5 September 2018 в 10:20
поделиться

Я узнал, что лучший способ для https и www в домене -

RewriteCond %{HTTPS} off 
RewriteCond %{HTTPS_HOST} !^www.cheapcarhire.gr$ [NC]
RewriteRule ^(.*)$ https://www.cheapcarhire.gr/$1 [L,R=301]
16
ответ дан GiorgosK 5 September 2018 в 10:20
поделиться

Это подход перенаправления 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

10
ответ дан icc97 5 September 2018 в 10:20
поделиться

Лучшее решение зависит от ваших требований. Это резюме ранее опубликованных ответов с некоторым добавленным контекстом.

Если вы работаете с веб-сервером 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]

. Если все работает нормально и вы хотите, чтобы браузеры помнили это перенаправление, вы можете объявить его постоянным, изменив последнее line to:

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']); 
} 
5
ответ дан maikel 5 September 2018 в 10:20
поделиться

Используя следующий код в вашем файле .htaccess, автоматически перенаправляет посетителей на HTTPS-версию вашего сайта:

RewriteEngine On

RewriteCond %{HTTPS} off

RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Если у вас есть существующий файл .htaccess:

Do не дублировать RewriteEngine On.

Убедитесь, что строки, начинающиеся с RewriteCond и RewriteRule, сразу следуют за уже существующим RewriteEngine On.

6
ответ дан meagar 5 September 2018 в 10:20
поделиться

Я нашел способ принудительно перенаправить все страницы моего сайта с http на аналоговые страницы https, которые работают для меня.

RewriteEngine On 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
1
ответ дан Oleg Apanovich 5 September 2018 в 10:20
поделиться

Добавьте следующий код в файл .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]
5
ответ дан Rahul 5 September 2018 в 10:20
поделиться

Через .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?

2
ответ дан Roshan Padole 5 September 2018 в 10:20
поделиться

Если вам не нужен mod_rewrite для других целей, использование директивы IF Apache core IF является более чистым и amp; быстрее:

<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/ (сайт, над которым я работаю).

2
ответ дан SashaK 5 September 2018 в 10:20
поделиться

Если вы используете балансировщик балансировки веб-сервисов Amazon Web Services, который принимает трафик https и перенаправляет его на ваш сервер (ы) с помощью http, здесь описывается правильный способ перенаправления всего HTTP-трафика на https: https: //aws.amazon.com/premiumsupport/knowledge-center/redirect-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-трафик на локальную разработку машина.

0
ответ дан ScottyB 5 September 2018 в 10:20
поделиться

Apache docs рекомендуют не использовать переписывание:

Чтобы перенаправить 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, как задано в вопросе.

Эта статья могла возникнуть только после того, как был задан вопрос и ответили , но, похоже, это текущий способ.

279
ответ дан ssc 5 September 2018 в 10:20
поделиться

Чтобы перенаправить все http запросы на https, вы можете использовать:

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]

Если mod-rewrite не включен и вы находитесь на apache 2.4, вы также можете использовать Redirect внутри if директивы для перенаправления http запросов на https.

Apache 2.4.

<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
2
ответ дан starkeen 5 September 2018 в 10:20
поделиться

Если вы используете Apache, mod_rewrite - это самое простое решение, и у него есть много документации в Интернете, как это сделать. Например: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html

0
ответ дан vcsjones 5 September 2018 в 10:20
поделиться

Сделайте все, что описано выше для перенаправления. Просто добавьте «HTTP Strict Transport Security» в свой заголовок. Это позволит избежать атаки человека в средней атаке.

Отредактируйте конфигурационный файл 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

4
ответ дан Waqas 5 September 2018 в 10:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: