【问题标题】:How can I mask a domain using .htaccess?如何使用 .htaccess 屏蔽域?
【发布时间】:2020-05-08 15:06:12
【问题描述】:

我们有以下情况:

我们想设置一个域掩码,以便从项目平台向最终用户提供内容。最终用户设置了一条从player.domain-client.com.app.domainA.comCNAME记录

现在当最终用户输入https://player.domain-client.com/5432 时,他应该得到https://app.domainA.com/player/?=5432 的内容。 但 URL 应保持为https://player.domain-client.com/5432。 仅当客户端子域包含 player 时才应应用此屏蔽。

谁能指出我如何设置.htaccess 以便正确屏蔽的正确方向?

【问题讨论】:

  • 你需要使用mod_proxy
  • 我认为这不需要反向代理 - 使用 DNS 中的 CNAME 条目,对 player.domain-client.com 的请求将已经到达正确的目标 Web 服务器。所以目标服务器现在要做的就是返回相应的内容。
  • @04FS 没错,我在匆忙中忽略了这一点! (太多类似的问题被问到是否需要反向代理。)
  • @Ab_lu 有了 CNAME,当您请求 https://player.domain-client.com/5432 时会发生什么?这与您在使用 app.domainA.com 主机时请求的 URL 路径相同吗?

标签: .htaccess masking


【解决方案1】:

最终用户设置了一条从player.domain-client.com.app.domainA.comCNAME记录

大概“项目平台”也被配置为接受对player.domain-client.com的请求?

在这种情况下,它应该只是一个简单的内部重写(在同一主机上)。虽然,如果您通常会在 app.domainA.com 处请求相同的 URL 路径,即。 app.domainA.com/5432,那么你不需要做任何事情,因为重写已经到位?否则,请尝试以下操作:

RewriteEngine On

# Rewrite any request for /<number> to player/?=<number>
RewriteCond %{HTTP_HOST} ^player\. [NC]
RewriteRule ^(\d+)$ player/?=$1 [L]

但是,/player/?=5432 不是实际的端点,因为这需要系统进一步重写才能“工作”。也许你的意思是/player/index.php?=5432? (查询字符串也有点奇怪,因为您缺少参数 name?正如所写,这可能需要手动解析查询字符串以提取值?)

UPDATE#1: 条件(RewriteCond 指令)确保只重写对 player 子域的请求。

更新#2: 在 WordPress 上,您需要确保这些指令在 WP 前端控制器之前。 IE。在# BEGIN WordPress 部分之前。 .htaccess 中的指令顺序很重要。

但是,如果这一切都由 WordPress 管理,那么您不能简单地在 .htaccess 中创建重写,因为 WordPress 仍然看到请求的原始 URL,而不是重写的 URL。因此,除非请求的 URL 在 WordPress 本身中作为有效路由存在,否则您可能会得到 404。这种重写需要在 WordPress 本身内部进行管理。

UPDATE#3:另一种方法是将您的服务器配置为反向代理,并将请求从https://player.domain-client.com/1234 代理到https://app.domainA.com/player/?vid=1234(在 cmets 中提到)。理想情况下,这需要访问主服务器配置才能正确配置(需要在虚拟主机中设置适当的 mod_proxy 和 ProxyPassProxyPassReverse 指令)。

然后,在.htaccess 中,您将使用P 上的P 标志代替RewriteRule

# Proxy any request for /<number> to player/?=<number>
# for the "player" subdomain only.
RewriteCond %{HTTP_HOST} ^player\. [NC]
RewriteRule ^(\d+)$ https://app.domainA.com/player/?vid=$1 [P]

【讨论】:

  • 非常感谢您的反馈。我实际上在 Wordpress 环境中。有没有办法设置重写规则,使其仅适用于特定的子域(在本例中为“player.*.*”?
  • “我实际上是在 Wordpress 环境中” - 这是“项目平台”?您需要确保这些指令出现在 WordPress 前端控制器之前。我已经更新了我的答案。
  • 我不知道我是否走在正确的轨道上:# BEGIN WordPress &lt;IfModule mod_rewrite.c&gt; RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] # Rewrite any request for /&lt;number&gt; to player/?=&lt;number&gt; RewriteCond %{HTTP_HOST} ^player\.(.*)$ [NC] RewriteRule ^(\d+)$ /player/vid?=$1 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] &lt;/IfModule&gt; # END WordPress
  • 理想情况下,这些指令将位于 before # BEGIN WordPress - 靠近文件顶部。您应该避免在 WP 代码块中手动编辑代码,因为 WP 本身会尝试维护这一点并且可能会覆盖您的自定义指令。
  • 我终于能够通过您的输入解决它。不得不在 Wordpress 中重写。
猜你喜欢
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多