.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
,因此我已将其包含在指令中。
此处不需要 L
和 NE
标志。 P
意味着 L
并且没有什么需要 替换 不被 URL 编码。斜杠在正则表达式中没有任何特殊含义,因此不需要转义。
我还使匹配“代码”的正则表达式更具限制性,而不是字面匹配 任何东西.
</code> 反向引用仅匹配 URL 路径中 <code>/embed/
之后的“代码”。
请注意指令的顺序很重要。它需要 在 任何可能导致冲突的指令之前。
如果 embed
和 subdomain
主机指向文件系统上的相同位置,那么您可以避免 mod_proxy 的复杂性和开销,只需“重写”请求同一个主机。
我们花了相当多的时间在其他地方寻找解决方案。我们已经阅读并尝试了推荐的线程。我们很可能对为什么这个或类似的东西不起作用有一个核心误解。
我们收到域请求:
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
,因此我已将其包含在指令中。
此处不需要 L
和 NE
标志。 P
意味着 L
并且没有什么需要 替换 不被 URL 编码。斜杠在正则表达式中没有任何特殊含义,因此不需要转义。
我还使匹配“代码”的正则表达式更具限制性,而不是字面匹配 任何东西.
</code> 反向引用仅匹配 URL 路径中 <code>/embed/
之后的“代码”。
请注意指令的顺序很重要。它需要 在 任何可能导致冲突的指令之前。
如果 embed
和 subdomain
主机指向文件系统上的相同位置,那么您可以避免 mod_proxy 的复杂性和开销,只需“重写”请求同一个主机。