apache 中的 vhost 重写规则 - 在不重定向的情况下摆脱子域

vhost rewrite rules in apache - get rid of the subdomain without redirecting

我知道有人问过类似的问题,但就我的生活而言,我似乎无法让它发挥作用。

想法是将子域重写为 url 的一部分。我们还希望请求由服务器处理,而不需要进行远程调用,并且客户端中的 url 不被重写。

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

'something' 是可选的。

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

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

#   RewriteCond %{HTTP_HOST} ^test\.example\.com$ [NC] 
#   RewriteRule ^(.*)$  "test%{REQUEST_URI}" 
#   RewriteRule ^(.*)$ test/ [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 重定向到新服务器,然后通过使用另一个 vhost 在新服务器上将其解释为 example.com/test(整个应用程序正在开发时没有子域,但我们将使用子域逐部分迁移,直到我们设法迁移所有内容并恢复 'normal' 方式)。

我们很快就会有 sub1.example.com、sub2.example.com 等。别名可能在这里发挥作用,但我无法理解。

感谢您的帮助!

听起来您需要 "reverse proxy",因为 example.com 实际托管在不同的服务器上。 (但是,您在评论中声明 "in the future" example.com 将回到同一台服务器上 - 如果子域和主域指向同一文件系统,那么您可能不需要 "reverse proxy" - 一个简单的重写就足够了。)

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

对于你需要的,当你从源到目标传递相同的 URL 路径时,你可以在虚拟主机容器中使用 ProxyPassProxyPassReverse 指令test.example.com 子域:

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

或者,如果您需要更复杂的映射,或者如果您 want/need 在 .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 服务器包含斜杠前缀,因此在 substitution 字符串中应将其省略。并且由于您使用的是 REQUEST_URI 服务器变量而不是反向引用,因此您不需要 RewriteRule 模式 中的捕获组。 IE。 ^(.*)$ 可以简化为 ^。与 P 一起使用时不需要 L,因为隐含了 L