Как я могу настроить 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 из корневого в субури, не нарушая ничего другого?

1
задан 20 May 2020 в 23:49
2 ответа

Тот же самый 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>
2
ответ дан 4 January 2021 в 08:26

Ответ Джерарда, предпочитающий 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>
2
ответ дан 4 January 2021 в 08:26

Теги

Похожие вопросы