在.htaccess的if语句中检查两个ip

Two ip check in the .htaccess's if statement

我尝试在 .htaccess 中向我网站上的一个页面授予对我的两个 IP 的访问权限,但我的 if 语句存在问题,即仅检查第一个 IP 而从不检查第二个 IP。我的代码是:

<If "%{REMOTE_ADDR} != '123.123.123.123'" AND "%{REMOTE_ADDR} != '456.456.456.456'">
RedirectMatch ^/mypage$ example.com [R=302,L]
</If>

我已经用 && 代替 AND 进行了测试,但它不起作用。这段代码有什么问题?

<If "%{REMOTE_ADDR} != '123.123.123.123'" AND "%{REMOTE_ADDR} != '456.456.456.456'">
RedirectMatch ^/mypage$ example.com [R=302,L]
</If>

这里有多个语法错误:

  • 正如您所指出的,您需要在表达式中使用 &&,而不是 AND。没有运算符 AND.

  • 双引号 " 应将整个表达式括起来。您基本上有两个独立的表达式,这是不受支持的。

  • RedirectMatch mod_alias 指令无效。第三个(标志)参数 [R=302,L] 是 mod_rewrite RewriteRule 指令的一部分,此处不允许使用。目标 URL(第二个参数)需要是 root-relative 或绝对 URL.

应该这样写:

<If "%{REMOTE_ADDR} != '123.123.123.123' && %{REMOTE_ADDR} != '456.456.456.456'">
    RedirectMatch 302 ^/mypage$ https://example.com/
</If>

不过,我会考虑为此使用 mod_rewrite。例如:

RewriteEngine On

RewriteCond %{REMOTE_ADDR} !=123.123.123.123
RewriteCond %{REMOTE_ADDR} !=456.456.456.456
RewriteRule ^mypage$ https://example.com/ [R=302,L]

注意:与 RewriteRule 模式 .

匹配的 URL-path 上没有斜杠前缀

如果您打算“阻止”访问,请考虑发送 403 Forbidden,而不是重定向。例如:

:
RewriteRule ^mypage$ - [F]

或者,如果在 <If> 表达式中使用 RedirectMatch

RedirectMatch 403 ^/mypage$