Допустим, у меня есть веб-сайт, доступный по HTTPS, например https://example.com/foo
. Рассмотрим следующие .htaccess
:
RewriteBase /
RewriteEngine On
RewriteRule ^foo$ bar [R=301,L]
Теперь, когда я приезжаю https://example.com/foo
, он перенаправляется на http://example.com/bar
, по HTTP вместо HTTPS.
Как я могу перейти на HTTPS, кроме использования полной схемы + хост для каждого RewriteRule
с R
флаг? То есть это будет то, что мне нужно:
RewriteBase /
RewriteEngine On
RewriteRule ^foo$ https://example.com/bar [R=301,L]
Однако мой .htaccess
файл содержит много таких RewriteRule
s, и кажется, что должен быть способ сообщить Apache / mod_rewrite «переписать на https://
по умолчанию". На самом деле я ищу директиву, сообщающую Apache, что сайт использует HTTPS, аналогично тому, как можно объявить имя хоста через ServerName foo.ext
. Это возможно?
Я предполагаю, что это аналогичный вопрос о переполнении стека: Как убедить Apache в оригинальном клиентском протоколе
ServerName
также принимает схему, например ServerName https://example.com
. Изменение этого параметра в конфигурации и перезапуск Apache помогли.
Из документация:
Иногда сервер работает за устройством, которое обрабатывает SSL, например обратным прокси, балансировщиком нагрузки или устройством разгрузки SSL. В этом случае укажите
https://
схему и номер порта, к которому подключаются клиенты вServerName
директива, чтобы убедиться, что сервер генерирует правильные URL-адреса, ссылающиеся на себя.
Вот способ сделать это:
RewriteEngine On
#redirect all your http trafic to https exept /foo & /bar
RewriteCond %{HTTP_HOST} ^example.com
RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} !(/foo|/bar)
RewriteRule (.*) https://example.com$1 [R=301,L]
#redirect /foo trafic to /bar
RewriteCond %{HTTP_HOST} ^example.com
RewriteCond %{REQUEST_URI} /foo
RewriteRule /foo(.*) http://example.com/bar$1 [R=301,L]
Поместите это в свой httpd.conf или перед всем своим виртуальным хостом, и он будет применяться ко всем запросам, начинающимся с example.com (www.example.com не будет перенаправлен)
Чтобы применить правило ко всем доменам, вы можете удалить строку RewriteCond %{HTTP_HOST} ^example.com
Для информации вам следует по возможности избегать использования .htaccess, чтобы предотвратить бесполезный доступ к жесткому диску.
Есть ли причина, по которой вы не используете простую директиву Rewrite?
Rewrite / https://example.com/
Для поддоменов вы можете сделать
Rewrite http://foo.example.com https://foo.example.com