.htaccess 内部路径重写的最佳实践?

Best practice for a .htaccess internal path rewrite?

我们花了相当多的时间在其他地方寻找解决方案。我们已经阅读并尝试了推荐的线程。我们很可能对为什么这个或类似的东西不起作用有一个核心误解。

我们收到域请求:

subdomain.domain.com/embed/34acb453bc4a53abc

我们希望 URL 保持原样,但需要将其定向到内部虚拟主机:

embed.example.com/34acb453bc4a53abc

一旦请求指向此,我们的系统就可以解释 34acb453bc4a53abc 和 return 适当的数据。

我们尝试了以下方法(及其变体),但没有任何效果。

RewriteCond ^embed\/(.*)$ [NC]

RewriteRule ^ https://embed.example.com%{REQUEST_URI} [L,NE,P]

internal path rewrite

澄清一下,您不能跨不同主机在内部重写请求。您需要使用 mod_proxy 和相关模块配置反向代理。这就是 RewriteRule 指令上的 P 标志正在做的......它将请求传递给 mod_proxy (假设这已经在服务器配置中正确配置)。

RewriteCond ^embed\/(.*)$ [NC]
RewriteRule ^ https://embed.example.com%{REQUEST_URI} [L,NE,P]

但是,这会将请求发送到 https://embed.example.com/embed/34acb453bc4a53abc,而不是您需要的 https://embed.example.com/34acb453bc4a53abc

您需要捕获 /embded/ 之后的 URL 路径部分并改用它。您已经在 RewriteCond 指令中捕获了它,但您没有使用它。您实际上不需要此处的 RewriteCond 指令。

尝试以下方法:

RewriteCond %{HTTP_HOST} =subdomain.domain.com
RewriteRule ^embed/([a-z0-9]+)$ https://embed.example.com/ [P]

您声明请求是针对 subdomain.domain.com,因此我已将其包含在指令中。

此处不需要 LNE 标志。 P 意味着 L 并且没有什么需要 替换 不被 URL 编码。斜杠在正则表达式中没有任何特殊含义,因此不需要转义。

我还使匹配“代码”的正则表达式更具限制性,而不是字面匹配 任何东西.

</code> 反向引用仅匹配 URL 路径中 <code>/embed/ 之后的“代码”。

请注意指令的顺序很重要。它需要 任何可能导致冲突的指令之前。

如果 embedsubdomain 主机指向文件系统上的相同位置,那么您可以避免 mod_proxy 的复杂性和开销,只需“重写”请求同一个主机。