Ssl

除了 https 重定向之外,如何配置 Apache 以將 root 重定向到 suburi?

  • May 21, 2020

我有一個執行大量網路應用程序的 Apache 網路伺服器。我已成功將每個單獨應用程序的傳入 http 流量重定向到 https,但我無法將所有進入根路徑(其中沒有任何內容)的流量路由到特定應用程序。我已經讓它適用於http,但不適用於https。

所以基本上現在以下 URLS 正確重定向:

http://example.com/app1 -> https://example.com/app1
http://example.com/app2 -> https://example.com/app2 等。
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 從 root 重定向到 suburi 呢?

http 和 https 的相同 RewriteRule 應該可以解決問題,如果有其他規則,請將它們放在首位。我更喜歡 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>

Gerard 的回答更喜歡mod_rewrite而不是mod_alias留下了一種錯覺,即使用 mod_alias 無法實現這一點。根據 Apache 的官方文件:

何時不使用 mod_rewrite

當發現需要其他替代方案時,應將mod_rewrite視為最後的手段。在有更簡單的替代方案時使用它會導致配置混亂、脆弱且難以維護。了解其他可用的替代方案是掌握mod_rewrite的非常重要的一步。

簡單重定向

mod_alias提供了RedirectandRedirectMatch指令,它們提供了一種將一個 URL 重定向到另一個 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>

引用自:https://serverfault.com/questions/1017988