该<If>
声明不会被忽略。“问题”是当在<If>
表达式中使用时,RewriteRule
模式匹配绝对文件系统路径,而不是您期望的请求的 URL 路径。
该<If>
块更改处理顺序。<If>
块很晚才被合并,通常是在.htaccess
文件被处理之后,并且似乎是在请求被重新映射回文件系统之后(即在目录前缀被添加回来之后)。
考虑到这一点,您可以将规则更改为以下内容以使其正常工作:
<If "%{HTTP_HOST} == '<myHost>'">
RewriteRule ^/file/path/to/document-root/$ <url> [R=301,L]
</If>
<Else>
RewriteRule ^/file/path/to/document-root/$ <another_url> [R=301,L]
</Else>
/file/path/to/document-root/
文档根目录的绝对文件系统路径在哪里(URL 路径映射/
到的位置)。
REQUEST_URI
或者,改为使用条件中的服务器变量检查 URL 路径。例如:
<If "%{HTTP_HOST} == '<myHost>'">
RewriteCond %{REQUEST_URI} =/
RewriteRule ^ <url> [R=301,L]
</If>
<Else>
RewriteCond %{REQUEST_URI} =/
RewriteRule ^ <another_url> [R=301,L]
</Else>
或者,检查(and ) 表达式REQUEST_URI
中的 var 。在 Apache 2.4.26+ 上,您可以嵌套表达式。例如:<If>
<ElseIf>
<If "%{REQUEST_URI} == '/'">
<If "%{HTTP_HOST} == '<myHost>'">
RewriteRule ^ <url> [R=301,L]
</If>
<Else>
RewriteRule ^ <another_url> [R=301,L]
</Else>
</If>
或者,按照@AmitVerma 的回答中的建议,在表达式中使用 mod_aliasRedirectMatch
指令。<If>
mod_alias RedirectMatch
(and Redirect
) 指令始终引用请求的(相对于根的)URL 路径,无论上下文如何,因此您不会像 mod_rewrite 那样获得这种歧义。
或者,直接使用 mod_rewrite,这里不需要<If>
/<Else>
表达式。例如:
RewriteCond %{HTTP_HOST} =<myHost>
RewriteRule ^$ <url> [R=301,L]
RewriteRule ^$ <another_url> [R=301,L]