我的情况有点特殊:我需要将子域名重定向到随机选择的备用域名,每个域名都在单独的服务器上。想想负载平衡,只是技术上有所不同。
在研究了我的选择后,Apache 的 RewriteMap 似乎是理想的解决方案,但我似乎无法让它做任何事情。以下是我目前得到的结果:
在我的配置文件中,我添加了:
RewriteMap map "rnd:/home/mydomain/public_html/servers.txt"
这是在服务器上下文中,而不是 VirtualHost 或 Directory 中。但是,我确实为 public_html 目录设置了“AllowOverride All”。是的,我确实记得在保存配置更改后重新启动 Apache。
接下来是 servers.txt 文件本身:
servers domain1.com|domain2.com|domain3.com
(这些域名是否暴露给用户并不重要,因此我现在只是把它放在public_html中,但如果我可以让它正常工作,我可能会把它移到其他地方。)
最后,我在 public_html 中有一个 .htaccess 文件,其中已经有几个有效的 Rewrite 条件和规则。RewriteEngine 已启用。但是当我添加...
RewriteCond %{HTTP_HOST} ^subdomain.domain.com$
RewriteRule ^(.*)$ "https://${map:servers}/$1" [P,L]
... 访问我的子域名只会显示子域名本身。我尝试了各种不同的标志,但都无济于事。最好的情况下,如果我将 [P] 标志替换为 [R=301],我可以从浏览器获得 ERR_INVALID_REDIRECT 响应,这至少告诉我该规则正在被处理。除此之外,我甚至没有在 Apache 的 error_log 文件中收到任何错误。我还确保没有其他规则具有 [L] 标志,这可能会导致跳过新规则。
据我所知,根据 Apache 文档,这是确切地RewriteMap 应该如何使用,所以我至少有点困惑。有人能告诉我我在这里遗漏了什么吗?
答案1
我还确保没有其他规则带有 [L] 标志
这敲响了警钟。这可能意味着你把这些指令放在了.htaccess
文件的错误位置。你的“重定向”应该放在文件顶部附近.htaccess
。(我希望最多 RewriteRule
指令要求L
标志,并至少进行优化。)
mod_rewrite 指令自然地串联在一起 - 因为前一个指令的输出是下一个指令的输入,依此类推。如果您已从L
前面的指令中删除标志并将重定向放置在文件后面,那么您的$1
反向引用不会捕获请求的 URL,而是捕获来自任何前面的指令的重写 URL。
您应该能够通过监控网络流量(在浏览器工具中)在浏览器中看到触发 ERR_INVALID_REDIRECT 的 URL。
如果我将 [P] 标志替换为 [R=301]
该P
标志通过 mod_proxy(作为反向代理 - 需要额外的配置)发送请求。如果你想外部重定向那么您应该使用该R
标志。