apache中的vhost重写规则-摆脱子域而不重定向

Posted

技术标签:

【中文标题】apache中的vhost重写规则-摆脱子域而不重定向【英文标题】:vhost rewrite rules in apache - get rid of the subdomain without redirecting 【发布时间】:2020-05-13 01:18:44 【问题描述】:

我知道有人问过类似的问题,但在我的一生中,我似乎无法让它发挥作用。

这个想法是将子域重写为 url 的一部分。我们还希望服务器在不进行远程调用的情况下处理请求,并且不重写客户端中的 url。

简单地说: http://test.example.com/(something) 应该被解释为http://example.com/test/(something)

“某事”是可选的。

我尝试了很多不同的解决方案,但似乎从来没有完全正确 - 这是我第一次体验。

#   RewriteEngine on 
#   RewriteCond %HTTP_HOST ^test.example.com [NC]
#   RewriteRule ^((?!test/).*)$ /test/$1 [L,NC]

#   RewriteCond %HTTP_HOST ^test\.example\.com$ [NC] 
#   RewriteRule ^(.*)$  "test%REQUEST_URI" 
#   RewriteRule ^(.*)$ test/$1 [L]  

#RewriteEngine on 
#RewriteCond %HTTP_HOST ^test.example.com [NC]
#RewriteRule ^(.*)$ example.com/test/%REQUEST_URI [P,L,NC]

重要的是要知道example.com/test/something 已经存在于不同的服务器上,不应使用或调用。

我的想法是将test.example.com重定向到新服务器,然后在新服务器上使用另一个虚拟主机将其解释为example.com/test(整个应用程序正在开发没有子域,但我们将逐步迁移使用子域,直到我们设法迁移所有内容并恢复“正常”方式)。

随着时间的推移,我们将拥有 sub1.example.com、sub2.example.com 等。别名可能会在这里发挥作用,但我的深度不够。

感谢您的帮助!

【问题讨论】:

您是否有权访问子域的服务器配置/虚拟主机?接受初始请求(到test.example.com)的服务器是否托管其他域? (只是想知道为什么当目标位于不同的服务器上时,您要显式检查请求的主机名?) @MrWhite 我认为最好的答案是我不知道自己在做什么,这就是我明确检查主机名的原因——目前这一切都是实验。最后,服务器将只托管 sub1.example.com、sub2.example.com(待重写)、admin.example.com(未重写)和将来 example.com。 Example.com 目前在其他地方。我现在确实可以访问我想要的所有内容 - 我无法在没有子域的情况下公开 example.com。 【参考方案1】:

听起来您需要“反向代理”,因为example.com 物理上托管在不同的服务器上。 (但是,您在 cmets 中声明“将来”example.com 将回到同一台服务器上 - 那时如果子域和主域指向同一个文件系统,您可能不需要“反向代理” - 一个简单的重写可能就足够了。)

要配置反向代理,您需要确保启用了 mod_proxy 和 mod_proxy_http(用于 HTTPS),并可能根据要求启用其他一些(可选)代理模块。

根据您的需要,在将相同的 URL 路径从源传递到目标的情况下,您可以在 test.example.com 子域的虚拟主机容器中使用 ProxyPassProxyPassReverse 指令:

ProxyPass / http://example.com/test/
ProxyPassReverse / http://example.com/test/

或者,如果您需要更复杂的映射,或者如果您想要/需要在 .htaccess 中执行此操作,那么您可以使用带有 P 标志的 mod_rewrite(就像您在上面所做的那样):

RewriteEngine On

RewriteCond %HTTP_HOST ^test\.example\.com [NC]
RewriteRule ^ http://example.com/test%REQUEST_URI [P]

重要的是,您需要 RewriteRule 中的绝对 URL(方案 + 主机名)替换(您的示例中缺少)。

如果此主机只接受对test.example.com 的请求,则不需要上述条件。

注意REQUEST_URI 服务器包含斜杠前缀,所以在substitution 字符串中应该省略它。由于您使用的是REQUEST_URI 服务器变量而不是反向引用,因此您不需要RewriteRule pattern 中的捕获组。 IE。 ^(.*)$ 可以简化为 ^LP 一起使用时不需要,因为 L 是隐含的。

【讨论】:

感谢您提供如此全面的回答。我会尽快尝试,但看起来代理是我丢失的主要砖块。再次感谢!

以上是关于apache中的vhost重写规则-摆脱子域而不重定向的主要内容,如果未能解决你的问题,请参考以下文章

Apache基于子域的重写

如何为开发环境配置 vhosts/apache 子域?

apache的重写规则

无法使用httpd-vhosts.conf从子域重定向到子子域

在通配符 vhost apache (xampp) 设置中重定向子子域

子域“m”。与 WordPress 和。 htaccess(在 htaccess 中的重写规则冲突。)