![除了 https 重定向之外,我该如何配置 Apache 以将根重定向到子 uri?](https://linux22.com/image/752687/%E9%99%A4%E4%BA%86%20https%20%E9%87%8D%E5%AE%9A%E5%90%91%E4%B9%8B%E5%A4%96%EF%BC%8C%E6%88%91%E8%AF%A5%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AE%20Apache%20%E4%BB%A5%E5%B0%86%E6%A0%B9%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E5%AD%90%20uri%EF%BC%9F.png)
我有一个运行着一堆 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提供
Redirect
和RedirectMatch
指令,提供将一个 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>