虚拟主机重写规则 摆脱子域而不重定向



我知道有人问过类似的问题,但对于我的生活,我似乎无法让它工作。

这个想法是将子域重写为 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 等。 别名可能会在这里发挥作用,但我超出了我的深度。

感谢您的帮助!

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

要配置反向代理,您需要确保启用mod_proxy和mod_proxy_http(用于 HTTPS(,并且可能还有其他一些(可选(代理模块,具体取决于要求。

对于您需要的内容,即在将相同的 URL 路径从源传递到目标时,您可以在 virtualhost 容器中使用test.example.com子域的ProxyPassProxyPassReverse指令:

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

或者,如果您需要更复杂的映射,或者如果您希望/需要在.htaccess中执行此操作,那么您可以将mod_rewrite与P标志一起使用(如上所示(:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^test.example.com [NC]
RewriteRule ^ http://example.com/test%{REQUEST_URI} [P]

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

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

请注意,REQUEST_URI服务器包含斜杠前缀,因此替换字符串中应省略该前缀。而且由于您使用的是REQUEST_URI服务器变量而不是反向引用,因此您不需要RewriteRule模式中的捕获组。即。^(.*)$可以简化为^。当与P一起使用时,L不是必需的,因为L是隐含的。

最新更新