我知道有人问过类似的问题,但对于我的生活,我似乎无法让它工作。
这个想法是将子域重写为 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
子域的ProxyPass
和ProxyPassReverse
指令:
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
是隐含的。