在 mod_rewrite 中屏蔽 URL

hoh*_*ner 6 mod-rewrite apache-2.2

有没有办法从一个域到另一个域进行 mod_rewrite,但始终保持浏览器 URL 相同?这就是我要的:

用户输入bacon.com 之类的内容并最终访问example.com/bacon,但浏览器 URL 始终保持为 bacon.com?

我基本上想在屏蔽 URL 的同时进行 mod_rewrite。对于缺乏想象力的示例域,抱歉,但现在仍然只有上午 10 点……我已经检查了很多其他答案,但它们通常总是涉及同一个域上的 mod_rewrites 。他们没有处理 bacon.com 已经是 example.com 的 ServerAlias 的事实。

Jen*_*y D 10

我可以给你三种方法来做到这一点。

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>
Run Code Online (Sandbox Code Playgroud)

如您所见,这不是重写;相反,您将 bacon.com 设置为使用 example.com/bacon 的基本目录作为它自己的 DocumentRoot。

2 使用 mod_rewrite 作为代理

如果您确实想改用 mod_rewrite,则可以让它使用 P 标志,这将使 mod_rewrite 充当代理。下面是一个例子:

RewriteRule /(.*) http://example.com/bacon/$1 [P]
Run Code Online (Sandbox Code Playgroud)

编辑回答评论:

由于您希望http://bacon.com/csshttp://example.com/css而不是http://example.com/bacon/css,因此请制定一个单独的规则,先行并捕获该特定 URL :

RewriteRule /css/(.*) http://example.com/css/$1 [P]
RewriteRule /(.*) http://example.com/bacon/$1 [P]
Run Code Online (Sandbox Code Playgroud)

为此,您需要加载并启用 mod_proxy。但是请注意,与直接使用 mod_proxy 相比,这会降低性能,因为它不处理持久连接或连接池。因此,如果您无法使用 VirtualHosts 做您想做的事,我建议您使用第三种方法:

3 直接使用 mod_proxy

<VirtualHost *:80>
  ServerName bacon.com

  ProxyPass http://example.com/bacon
  ProxyPassReverse  http://example.com/bacon
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅mod_proxy 文档