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