在 mod_rewrite 中屏蔽 URL

在 mod_rewrite 中屏蔽 URL

有没有办法从一个域到另一个域执行 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 文档

相关内容