除了 https 重定向之外,我该如何配置 Apache 以将根重定向到子 uri?

除了 https 重定向之外,我该如何配置 Apache 以将根重定向到子 uri?

我有一个运行着一堆 Web 应用程序的 Apache Web 服务器。我已成功将每个应用程序的传入 http 流量重定向到 https,但我无法将所有传入根路径(其中没有任何内容)的流量路由到特定应用程序。我已将其用于 http,但无法用于 https。

因此,从本质上讲,现在以下 URL 重定向正确:

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 而不破坏其他任何东西?

答案1

相同的 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

Gerard 的答案是mod_rewrite超过mod_alias给人一种错觉,认为使用 mod_alias 无法实现这一点。根据 Apache 的官方文档:

何时不使用 mod_rewrite

mod_rewrite在其他替代方案不理想时,应将其视为最后的手段。当有更简单的替代方案时使用它会导致配置混乱、脆弱且难以维护。了解其他可用的替代方案是迈向mod_rewrite掌握。

简单重定向

mod_alias提供RedirectRedirectMatch指令,提供将一个 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>

相关内容