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
子域的虚拟主机容器中使用 ProxyPass
和 ProxyPassReverse
指令:
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。 ^(.*)$
可以简化为 ^
。 L
与 P
一起使用时不需要,因为 L
是隐含的。
【讨论】:
感谢您提供如此全面的回答。我会尽快尝试,但看起来代理是我丢失的主要砖块。再次感谢!以上是关于apache中的vhost重写规则-摆脱子域而不重定向的主要内容,如果未能解决你的问题,请参考以下文章
无法使用httpd-vhosts.conf从子域重定向到子子域