繁体   English   中英

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

[英]Best practice for a .htaccess internal path rewrite?

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

我们收到一个域名请求:

subdomain.domain.com/embed/34acb453bc4a53abc

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

embed.example.com/34acb453bc4a53abc

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

我们尝试了以下(及其变体),但没有任何工作。

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

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

内部路径重写

澄清一下,您不能在内部跨不同主机重写请求。 您需要使用 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/$1 [P]

您 state 请求是针对subdomain.domain.com的,所以我已将其包含在指令中。

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

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

然后, $1反向引用仅匹配 URL 路径中/embed/后面的“代码”。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM