1

这是我的.htaccess文件:

 RewriteEngine On

 <If "%{HTTP_HOST} == '<myHost>'">
   RewriteRule ^$ <url> [R=301,L]
 </If>
 <Else>
  RewriteRule ^$ <another_url> [R=301,L]
 </Else>

但它不起作用,似乎该<If>语句被忽略了。我还从 PHP 中做出了回应,$_SERVER['HTTP_HOST']在那里我得到了我期望的值。此外,RewriteRule如果我删除 If/Else 语句,则它正在工作。

我将 Azure Webapp 与 Apache/2.4.38 (Debian) 一起使用

4

2 回答 2

1

在内部ifelse块中,您可以使用RedirectMatch指令,因为它与它一起使用。RewriteRule 不起作用,因为它会覆盖 IF/ELSE 并与之冲突。

 RewriteEngine On

 <If "%{HTTP_HOST} == '<myHost>'">
 RedirectMatch 301 ^/$ https://example.com
 </If>
 <Else>
 RedirectMatch ^/$ https://example2.com
 </Else>
于 2021-08-02T11:04:47.137 回答
1

<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]
于 2021-08-06T20:06:03.463 回答