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 路径时,你可以在虚拟主机容器中使用 ProxyPass
和 ProxyPassReverse
指令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
。
我知道有人问过类似的问题,但就我的生活而言,我似乎无法让它发挥作用。
想法是将子域重写为 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 路径时,你可以在虚拟主机容器中使用 ProxyPass
和 ProxyPassReverse
指令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
。