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

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

Я хотел бы заставить все не-SSL-соединения к моему серверу перенаправляться на SSL. У меня есть только один vhost (и он будет надежно сохраняться в течение всего срока службы сервера), но я бы хотел избежать жесткого кодирования доменного имени, отчасти так, чтобы 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 sysadmin ни в коем случае не является основной частью моей работы, поэтому я стараюсь изо всех сил стараться изо всех сил. Спасибо всем!

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам