Назад | Перейти на главную страницу

Принудительное использование SSL в Apache без жесткого кодирования имени хоста

я считать что у меня это отсортировано (в основном благодаря вопросу Как перенаправить не-www на www без жесткого кодирования с помощью .htaccess?), но я до сих пор не совсем понимаю пару вещей.

Я хочу принудительно перенаправлять все не-SSL-соединения с моим сервером на SSL. У меня только один виртуальный хост (и он будет надежно сохраняться в течение всего срока службы сервера), но я хотел бы избежать жесткого кодирования доменного имени, отчасти для того, чтобы httpd.conf файлы для постановки и производства остаются идентичными.

Я знаю, что могу заставить запросы использовать SSL с mod_rewrite правило как

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

или

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

Однако у меня есть два относительно простых вопроса:

  1. Должен ли я предпочесть один из тех RewriteCond высказывания над другими по какой-либо причине? Предположительно, если я использую %{SERVER_PORT} переменная, любые соединения, скажем, на порт 8000 будут продолжать обслуживаться в открытом виде? Есть ли причина, по которой мне следует избегать использования %{HTTPS} переменная, которую я не замечаю?
  2. Будет ли это %{HTTP_HOST} переменная в RewriteRule заявление следует уважать и автоматически заменять в любом Host: заголовок был из запроса? Есть ли обстоятельства, при которых это может не сработать?

Если это имеет значение, мы запускаем Apache 2 на RedHat с mod_ssl и сайт использовал Drupal 7.

Простите за относительно глупый вопрос; Системный администратор Apache ни в коем случае не является основной частью моей работы, поэтому я стараюсь делать все, что в моих силах. Спасибо всем!

Я всегда использовал что-то вроде следующего:

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Потому что иногда мне нравится обслуживать HTTP через порты, отличные от 80. Что ж, я не люблю это делать, но иногда нужно и так далее. %{HTTPS} будет истинным, например, если SSL используется через порт 80.

Думаю, я обычно использую

RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

%{HTTP_HOST} всегда будет то, что установлено как Host: заголовок клиентом.

Однако мне приходит в голову ... что есть другой способ сделать это.

<VirtualHost *:80>
   ServerName mysite.example.com
   Redirect permanent / https://mysite.example.com/
</VirtualHost>

Вы заметите, что в приведенном выше блоке нет DocumentRoot. Если вы перенаправляете все, вам он не нужен.

Если вы хотите перенаправить только часть вашего сайта на SSL, вы можете просто сделать

Redirect permanent /secure https://mysite.example.com/secure

Я думаю, что вариант «Перенаправление» более предпочтителен для принудительной установки HTTPS на весь сайт, потому что это на один уровень безумия меньше (как любезно предоставлено mod_rewrite).

Это может быть даже быстрее, так как будет на один модуль меньше для загрузки / запуска.