я считать что у меня это отсортировано (в основном благодаря вопросу Как перенаправить не-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]
Однако у меня есть два относительно простых вопроса:
RewriteCond
высказывания над другими по какой-либо причине? Предположительно, если я использую %{SERVER_PORT}
переменная, любые соединения, скажем, на порт 8000 будут продолжать обслуживаться в открытом виде? Есть ли причина, по которой мне следует избегать использования %{HTTPS}
переменная, которую я не замечаю?%{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).
Это может быть даже быстрее, так как будет на один модуль меньше для загрузки / запуска.