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

Как я могу настроить Apache для перенаправления root на suburi в дополнение к перенаправлению https?

У меня есть веб-сервер 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>