У меня есть веб-сервер 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 из корневого в субури, не нарушая ничего другого?
Тот же самый 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>
Ответ Джерарда, предпочитающий 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] 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>