У меня есть веб-сервер Apache, на котором запущено множество веб-приложений. Я успешно перенаправил входящий HTTP-трафик на https для каждого отдельного приложения, но у меня возникают проблемы с маршрутизацией ВСЕГО трафика, поступающего по корневому пути (на котором ничего нет), в конкретное приложение. У меня он работает для http, но не для https.
Итак, прямо сейчас следующие URL-адреса перенаправляются правильно:
http://example.com/app1 -> https://example.com/app1 http://example.com/app2 -> https://example.com/app2 etc. http://example.com -> https://example.com/app1
но я не могу понять, как это сделать:
https://example.com -> https://example.com/app1
Мой файл конфигурации Apache содержит следующее:
<VirtualHost xxx.xxx.xxx.xx:80>
ServerName example.com
RedirectMatch 301 ^/$ /app1/
Redirect permanent / https://example.com/
</VirtualHost>
Я пробовал добавлять пары RewriteCond / RewriteRule, например
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule ^/$ https://example.com/app1 [R=301,L]
а также множество других вещей, которые, как я думал, должны работать, и они либо ничего не делают, либо нарушают другие части моей конфигурации.
В случае, если это имеет значение, мой сертификат SSL является многодоменным, поскольку у меня также есть другие домены, указывающие на приложения на этом сервере. Все они отлично работают со следующим (хотя у них нет дополнительных требований к перенаправлению):
<VirtualHost xxx.xxx.xxx.xx:80>
ServerName example2.com
Redirect permanent / https://example2.com/
</VirtualHost>
Итак, как я могу сделать перенаправление https с корня на субури, не нарушая ничего другого?
Джерард ответ предпочитает mod_rewrite над mod_alias оставляет иллюзию, что этого нельзя достичь с помощью mod_alias. Согласно официальной документации Apache:
Когда не использовать mod_rewrite
mod_rewrite следует рассматривать как крайнюю меру, когда не хватает других альтернатив. Его использование, когда есть более простые альтернативы, приводит к сбивающим с толку, хрупким и сложным в обслуживании конфигурациям. Понимание того, какие другие альтернативы доступны, - очень важный шаг к mod_rewrite мастерство.
Простое перенаправление
mod_alias предоставляет
Redirect
иRedirectMatch
директивы, которые позволяют перенаправить один URL-адрес на другой. Такое простое перенаправление одного URL-адреса или класса URL-адресов в другое место должно выполняться с использованием этих директив, а неRewriteRule
.RedirectMatch
позволяет включать регулярное выражение в критерии перенаправления, обеспечивая многие преимущества использованияRewriteRule
.
Единственная проблема с твоим RedirectMatch 301 ^/$ /app1/
в том, что последний параметр не URL, а относительная ссылка.
RedirectMatch
ДирективаСинтаксис:
RedirectMatch [status] regex URL
Полная конфигурация с использованием mod_alias будет, например:
<VirtualHost *:80>
ServerName example.com
RedirectMatch 301 ^/$ https://example.com/app1/
Redirect permanent / https://example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
RedirectMatch 301 ^/$ https://example.com/app1/
</VirtualHost>
Тот же самый RewriteRule для http и https должен помочь, поместите их первыми, если есть другие. Я предпочитаю mod_rewrite, а не mod_alias.
<VirtualHost xxx.xxx.xxx.xx:80>
ServerName example.com
RewriteEngine On
RewriteRule ^/$ https://example.com/app1 [R=301,L]
</VirtualHost>
<VirtualHost xxx.xxx.xxx.xx:443>
ServerName example.com
RewriteEngine On
RewriteRule ^/$ https://example.com/app1 [R=301,L]
</VirtualHost>