带有AND和OR的Apache If语句

hgqdbh6s  于 2023-03-24  发布在  Apache
关注(0)|答案(1)|浏览(70)

我运行的是Apache 2.4.20,所以我没有选择使用嵌套的if语句(我相信是2.4.26)。
我试图将所有HTTP请求重定向到特定的安全URL。但是10.156.108.[2-3]是防火墙的keepalive,所以我想排除它们。

  • 如果HTTPS关闭且远程IP不是10.156.108.[2-3],则重定向。*
    这显然是有效的,但仅适用于特定的IP:
<If "%{HTTPS} == 'off' && %{REMOTE_HOST} != '10.156.108.2'">
    Redirect "/" https://www.example.com/ 
</If>

失败

<If "%{HTTPS} == 'off' && (%{REMOTE_HOST} != '10.156.108.2' || %{REMOTE_HOST} != '10.156.108.3')">
    Redirect "/" https://www.example.com/
</If>

失败

<If "%{HTTPS} == 'off' && %{REMOTE_HOST} != '10.156.108.[2-3]'">
    Redirect "/" https://www.example.com/
</If>

任何想法,谢谢。
艾迪

lymnna71

lymnna711#

为什么第二个例子失败了?因为括号?我认为你必须把spaces between parentheses,可能像这样:

<If "%{HTTPS} == 'off' && ( %{REMOTE_HOST} != '10.156.108.2' || %{REMOTE_HOST} != '10.156.108.3' )">
    Redirect "/" https://www.example.com/
</If>

你也可以尽量避免使用括号:

<If "%{HTTPS} == 'off' && %{REMOTE_HOST} != '10.156.108.2' && %{REMOTE_HOST} != '10.156.108.3'">
    Redirect "/" https://www.example.com/
</If>

逻辑上应该和第一个相同。
实际上,我在研究如何使用正则表达式与Apache指令时偶然发现了你的问题,所以我将使用的解决方案,但适用于你的用例:

<If "%{HTTPS} == 'off' && %{REMOTE_HOST} !~ /10\.156\.108\.[23]/ ">
    Redirect "/" https://www.example.com/
</If>

**!~**表示一个string does not match the regular expression比较运算符,下面的正则表达式似乎是有效的when tested on Regexr(在您的用例中,您可以省略我必须使用的最后一个正斜杠后面的g)。

希望这些棍子中的一根。如果没有其他的工作,这应该:

<If "%{HTTPS} == 'off' && %{REMOTE_HOST} != '10.156.108.2'">
    Redirect "/" https://www.example.com/
</If>
<ElseIf "%{HTTPS} == 'off' && %{REMOTE_HOST} != '10.156.108.3">
    Redirect "/" https://www.example.com/
</ElseIf>

相关问题