Заставить HTTPS в домене Addon? [Дубликат]

203
задан lpd 17 May 2016 в 15:18
поделиться

10 ответов

Для Apache вы можете использовать mod_ssl для принудительного SSL с помощью SSLRequireSSL Directive :

Эта директива запрещает доступ, если только HTTP over SSL (т.е. HTTPS) включен для текущего соединения. Это очень удобно внутри виртуального хоста или каталогов с поддержкой SSL для защиты от ошибок конфигурации, которые выставляют материал, который должен быть защищен. Когда эта директива присутствует, все запросы отклоняются, которые не используют SSL.

Это не будет делать переадресацию на https. Чтобы перенаправить, попробуйте следующее с mod_rewrite в вашем файле .htaccess

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

или любом из различных подходов, приведенных в

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

if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
    if(!headers_sent()) {
        header("Status: 301 Moved Permanently");
        header(sprintf(
            'Location: https://%s%s',
            $_SERVER['HTTP_HOST'],
            $_SERVER['REQUEST_URI']
        ));
        exit();
    }
}
385
ответ дан UKB 25 August 2018 в 22:48
поделиться

Этот код работает для меня

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
0
ответ дан Alexufo 25 August 2018 в 22:48
поделиться

Я хотел бы отметить, что Apache имеет худшие правила наследования при использовании нескольких файлов .htaccess в глубинах каталогов. Две ключевые ошибки:

  • По умолчанию будут выполняться только правила, содержащиеся в самом глубоком файле .htaccess. Вы должны указать директиву RewriteOptions InheritDownBefore (или аналогичную), чтобы изменить это. (см. вопрос)
  • Шаблон применяется к пути к файлу относительно подкаталога, а не к верхней директории, содержащей файл .htaccess с заданным правилом. (см. обсуждение)

Это означает, что предлагаемое глобальное решение на Apache Wiki работает не , если вы используете любые другие файлы .htaccess в подкаталогах. Я написал модифицированную версию, которая делает:

RewriteEngine On
# This will enable the Rewrite capabilities

RewriteOptions InheritDownBefore
# This prevents the rule from being overrided by .htaccess files in subdirectories.

RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS

RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [QSA,R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e.  http://www.example.com/foo/ to https://www.example.com/foo/
6
ответ дан Community 25 August 2018 в 22:48
поделиться

Решение на основе mod-rewrite:

Используя следующий код в htaccess, автоматически пересылает все HTTP-запросы на https.

RewriteEngine on

RewriteCond %{HTTPS}::%{HTTP_HOST} ^off::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]

Это перенаправит ваши не-www и www http запросы на www-версию https.

Другое решение (Apache 2.4 *)

RewriteEngine on

RewriteCond %{REQUEST_SCHEME}::%{HTTP_HOST} ^http::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]

Это не работает в более низких версиях apache, поскольку переменная% {REQUEST_SCHEME} была добавлена ​​в mod-rewrite с 2.4.

7
ответ дан Glorfindel 25 August 2018 в 22:48
поделиться

попробуйте этот код, он будет работать для всех версий URL, таких как

0
ответ дан Kashif Latif 25 August 2018 в 22:48
поделиться

Решение PHP

Заимствуя непосредственно из очень полного ответа Гордона, я отмечаю, что в вашем вопросе упоминается, что он зависит от страницы при форсировании соединений HTTPS / SSL.

function forceHTTPS(){
  $httpsURL = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
  if( count( $_POST )>0 )
    die( 'Page should be accessed with HTTPS, but a POST Submission has been sent here. Adjust the form to point to '.$httpsURL );
  if( !isset( $_SERVER['HTTPS'] ) || $_SERVER['HTTPS']!=='on' ){
    if( !headers_sent() ){
      header( "Status: 301 Moved Permanently" );
      header( "Location: $httpsURL" );
      exit();
    }else{
      die( '<script type="javascript">document.location.href="'.$httpsURL.'";</script>' );
    }
  }
}

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

HTACCESS / mod_rewrite Решение

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

RewriteEngine on

# Check for POST Submission
RewriteCond %{REQUEST_METHOD} !^POST$

# Forcing HTTPS
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{SERVER_PORT} 80
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_secure [OR]
RewriteCond %{REQUEST_URI} ^something_else_secure
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

# Forcing HTTP
RewriteCond %{HTTPS} =on [OR]
RewriteCond %{SERVER_PORT} 443
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_public [OR]
RewriteCond %{REQUEST_URI} ^something_else_public
RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
34
ответ дан Luke Stevenson 25 August 2018 в 22:48
поделиться

Я нашел решение mod_rewrite, которое хорошо работает как для проксированных, так и для непропитанных серверов.

Если вы используете CloudFlare, балансировку балансировки нагрузки AWS, Heroku, OpenShift или любые другое решение Cloud / PaaS, и вы испытываете петли перенаправления с обычными переадресациями HTTPS, попробуйте вместо этого следующий фрагмент.

RewriteEngine On

# If we receive a forwarded http request from a proxy...
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]

# ...or just a plain old http request directly from the client
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on

# Redirect to https version
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
41
ответ дан raphinesse 25 August 2018 в 22:48
поделиться

Просто и просто, просто добавьте следующие

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
0
ответ дан Saurabh Mistry 25 August 2018 в 22:48
поделиться

Простой:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.example\.com)(:80)? [NC]
RewriteRule ^(.*) https://example.com/$1 [R=301,L]
order deny,allow

заменить ваш url example.com

0
ответ дан Sepehr Norouzi 25 August 2018 в 22:48
поделиться

для принудительного использования SSL с Apache .htaccess вы можете использовать

SSLOptions +StrictRequire
SSLRequireSSL

для перенаправления вышеуказанного ответа правильно

0
ответ дан webdesignwien 25 August 2018 в 22:48
поделиться