有没有办法从一个域到另一个域执行 mod_rewrite,但始终保持浏览器 URL 不变?这就是我想要的:
用户输入类似培根网最终example.com/bacon,但浏览器网址始终保持为bacon.com?
我基本上想在屏蔽 URL 的同时执行 mod_rewrite。抱歉,示例域名缺乏想象力,但现在才上午 10 点……我检查了很多其他答案,但它们通常都涉及 mod_rewrites相同的域。他们没有处理 bacon.com 已经是 example.com 的 ServerAlias 这一事实。
答案1
我可以给你三种方法来实现这一点。
1 使用虚拟主机
假设 bacon.com 是 example.com 的 ServerAlias,即它们都在同一台服务器上,那么你完全无需使用任何 mod_rewrite 即可完成此操作。可以这样想:mod_rewrite 是将 URL 映射到文件系统的最基本方法。因此,我要做的就是简单地设置一个单独的 VirtualHost,使用正确的目录作为其基础。
以下是一个简单的例子:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName example.com
DocumentRoot /www/files
[... all other config you have for example.com]
</VirtualHost>
<VirtualHost *:80>
ServerName bacon.com
DocumentRoot /www/files/bacon
# To have CSS directly under /www/files/css instead of /www/files/bacon/css
Alias /css /www/files/css
[... all other config you have for bacon.com]
</VirtualHost>
如您所见,这不是重写;相反,您正在设置 bacon.com 以使用 example.com/bacon 的基本目录作为其自己的 DocumentRoot。
2 使用 mod_rewrite 作为代理
如果您确实想使用 mod_rewrite,您可以让它使用 P 标志,这将使 mod_rewrite 充当代理。以下是示例:
RewriteRule /(.*) http://example.com/bacon/$1 [P]
编辑以回答评论:
因为你想要http://bacon.com/css成为http://example.com/css代替http://example.com/bacon/css,制定一条单独的规则,首先捕获该特定的 URL:
RewriteRule /css/(.*) http://example.com/css/$1 [P]
RewriteRule /(.*) http://example.com/bacon/$1 [P]
为了做到这一点,您需要加载并启用 mod_proxy。但请注意,与直接使用 mod_proxy 相比,这会降低性能,因为它不处理持久连接或连接池。因此,如果您无法使用 VirtualHosts 实现您想要的功能,我建议您使用第三种方法:
3 直接使用 mod_proxy
<VirtualHost *:80>
ServerName bacon.com
ProxyPass http://example.com/bacon
ProxyPassReverse http://example.com/bacon
</VirtualHost>
有关更多信息,请参阅mod_proxy 文档