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

Как сделать редирект Apache mod_rewrite через HTTPS по умолчанию?

Допустим, у меня есть веб-сайт, доступный по 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 файл содержит много таких RewriteRules, и кажется, что должен быть способ сообщить 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