htaccess <if> 使用HTTP_HOST语句中的重写规则



我在一台服务器上从一个.htaccess文件运行多个网站,该文件具有使用一个页面的自定义网站设计(index.php?pageid=x(。根据页面ID,它会触发不同的内容/布局。

对于每个站点,我都在.htaccess中使用IF语句,例如:

<If "%{HTTP_HOST} == 'site.com'">     
RewriteRule goes here
</If>

如果我退出了If语句,我会使用这样的重写规则:

RewriteRule ^fr/cookie-policy/$ /index.php?pageid=11 [L]

上面的规则按计划工作,但如果我在if语句中使用这个规则,它就不起作用。我必须删除前导^并将其替换为/。但这远不是理想的,因为它可以匹配任何带有指定图案的末端。

有人能提出解决方案吗?我错过了什么?

<If>容器更改处理顺序。<If>容器很晚才合并。请参阅:如何在Apache文档中合并部分

这导致<If>中的RewriteRule指令与请求映射到的绝对文件系统路径匹配,包括目录前缀,当在目录上下文(即.htaccess(中匹配时,通常会删除该前缀。(也许在处理<If>部分时,请求已映射回文件系统?(

RewriteRule ^fr/cookie-policy/$ /index.php?pageid=11 [L]

因此,如果fr/cookie-policy/是相对于文档根的,而DocumentRoot/var/www/user/public_html,则要与该完全匹配,需要与/var/www/user/public_html/fr/cookie-policy/匹配。

除非您使用额外的条件(并对照REQUEST_URI服务器变量进行检查(,否则我看不出有任何方法可以避免这种情况,但这似乎违背了这一点(而且效率较低(。

它将匹配任何以指定模式结束的内容。

在不指定完整的绝对文件路径的情况下,您可以只包括父目录(即文档根目录上方的一个目录(来减少这种情况的发生。例如CCD_ 12。


我在<If>部分中使用mod_rewrite时注意到的其他一些(奇怪的(注意事项:

  • 您不能重写到相对路径(即不以斜杠或scheme+主机名开头(。它需要以斜杠(即相对根(开头。在目录上下文中重写到相对路径通常会导致目录前缀被添加回。然而,在<If>容器内,目录前缀看起来是*If/,这可能会导致";400坏请求";。(也许这是因为在合并<If>部分时,目录前缀已经添加回来了?(

  • 与上述相关,RewriteBase指令是";忽略";。

  • <If>节外部的其他mod_rewrite指令(至少在相同的上下文中(似乎采取了相同的行为,现在也只与完整的绝对文件系统路径匹配。

  • 尽管CCD_ 19部分被合并;迟到";。在<If>节之外的其他mod重写指令之前,它们仍然被处理。不管指令的顺序如何。(至少在相同的上下文中。(

  • 另请参阅:<如果>htaccess中HTTP_HOST的条件破坏了PHP

通常,如果在应用特定重写之前需要检查HTTP_HOST,则应在前面的RewriteCond(条件(中进行检查。但你知道

最新更新