.htaccess htaccess重写规则在<;如果>;使用HTTP\U主机的语句
我从一个.htaccess文件在一台服务器上运行多个站点,该文件具有使用一个页面(index.php?pageid=x)的自定义站点设计。根据页面ID,它会触发不同的内容/布局 对于每个站点,我都在.htccess中使用IF语句,例如:.htaccess htaccess重写规则在<;如果>;使用HTTP\U主机的语句,.htaccess,.htaccess,我从一个.htaccess文件在一台服务器上运行多个站点,该文件具有使用一个页面(index.php?pageid=x)的自定义站点设计。根据页面ID,它会触发不同的内容/布局 对于每个站点,我都在.htccess中使用IF语句,例如: <If "%{HTTP_HOST} == 'site.com'"> RewriteRule goes here </If> 上面的规则按计划工作,但是如果我在if语句中使用此规则,它将不起作用。我必须删除前
<If "%{HTTP_HOST} == 'site.com'">
RewriteRule goes here
</If>
上面的规则按计划工作,但是如果我在if语句中使用此规则,它将不起作用。我必须删除前导“^”,并将其替换为/。但这远非理想,因为它将匹配任何具有指定模式的端点
有人能提出解决办法吗?我缺少什么?容器更改处理顺序<代码>容器很晚才合并。见:
这导致
中的重写规则
指令与请求映射到的绝对文件系统路径(包括目录前缀)匹配,在目录上下文(即.htaccess
)中进行匹配时,通常会删除目录前缀。(可能在处理
部分时请求已映射回文件系统?)
因此,如果fr/cookie policy/
与文档根相对,并且DocumentRoot
是/var/www/user/public\u html
,那么要精确匹配这一点,您需要匹配/var/www/user/public\u html/fr/cookie policy/
除非使用附加条件(并对照REQUEST\u URI
server变量进行检查),否则我看不到任何避免这种情况的方法,但这似乎违背了要点(而且效率较低)
它将以指定的模式匹配任何端点
在不指定完整的绝对文件路径的情况下,您可以只包含父目录(即文档根目录上方的目录),以减少发生这种情况的可能性。例如,public\u html/fr/cookie策略/$
在
部分中使用mod_rewrite时,我注意到了一些其他(奇怪的)警告:
- 不能重写为相对路径(即不以斜杠或scheme+主机名开头)。它需要以斜杠开始(即根相对)。在目录上下文中重写到相对路径通常会导致重新添加目录前缀。但是,在
容器中,目录前缀似乎被视为
-这可能会导致“400错误请求”。(这可能是因为在合并*If/
部分时,目录前缀已经添加回来了?) - 与上述相关,
指令被“忽略”RewriteBase
部分之外的其他mod_rewrite指令(至少在相同的上下文中)似乎具有相同的行为,现在也仅与完全绝对文件系统路径匹配- 尽管
节被“延迟”合并。它们仍然在
部分之外的其他mod rewrite指令之前进行处理。不管指令的顺序如何。(至少在相同的上下文中。) - 另见:
通常,如果在应用特定重写之前需要检查
HTTP\u主机
,则可以在前面的RewriteCond
(条件)中进行检查。但是可能与这些指令的评估顺序有关。如果只添加前导斜杠,即重写规则^/fr/…,是否有效?如果没有,那么在此之前可能有更多的路径段在这一点上没有被剥离。@04FS如果我按照您在If语句中的建议添加前导斜杠,它将以404失败。然后找出您在这一点上处理的实际URL路径是什么<代码>重写规则(.*)https://example.com?path=$1[R=302]此时应捕获完整路径,并进行外部重定向到https://example.com?path=…
-该参数在接收端不会起任何作用,但是,在浏览器地址栏中检查重定向到的位置应该可以清楚地显示此时实际的URL路径。(是的,我的意思是https://example.com
在这里,请不要用您自己的域替换它。)
RewriteRule ^fr/cookie-policy/$ /index.php?pageid=11 [L]
RewriteRule ^fr/cookie-policy/$ /index.php?pageid=11 [L]