使用RewriteCond重定向一系列IP

xyl*_*lar 23 apache .htaccess mod-rewrite

目前我使用以下方法重定向除IP 12.345.678.90以外的所有用户:

RewriteEngine On
RewriteCond %{REQUEST_URI} !/maintenance$
RewriteCond %{REMOTE_HOST} !^12\.345\.678\.90
RewriteRule $ /maintenance [R=302,L]
Run Code Online (Sandbox Code Playgroud)

我将使用什么语法来允许范围?在我的允许列表中,我有:

Allow from 123.45.678.90/28
Run Code Online (Sandbox Code Playgroud)

如果我只是将REMOTE_HOST行更新为:

RewriteCond %{REMOTE_HOST} !^12\.345\.678\.90/28
Run Code Online (Sandbox Code Playgroud)

Jon*_*Lin 22

您可能希望%{REMOTE_ADDR}匹配,但您不能使用CIDR表示法,因为%{REMOTE_ADDR}实际上是远程地址,您可以使用正则表达式尝试匹配它.因此,对于123.45.67.89/28,(123.45.67.80 - 123.45.67.95),您必须执行以下操作:

RewriteCond %{REMOTE_ADDR} !^123\.45\.67\.8[0-9]$
RewriteCond %{REMOTE_ADDR} !^123\.45\.67\.9[0-5]$
Run Code Online (Sandbox Code Playgroud)

  • 如果你想匹配更大的范围 - 例如,不确定的第三和第四个八位字节 - 你可以做 `!^123\.45\.[0-9]{1,3}\.[0-9]{1,3 }$` -- 这将匹配第三和第四个八位字节中 0-255 之间的任何数字,但让您定义 IP 的前半部分。最近不得不在我正在开发的 WordPress 上执行此操作,以允许 WordPress JetPack 服务器连接到 XML-RPC 端点,同时仍将常规访问者重定向到单独的站点。 (2认同)

zts*_*zts 22

如果您使用的是Apache HTTPD 2.4或更高版本,则可以使用表达式将REMOTE_ADDR与CIDR掩码进行匹配.

简短形式如下:

RewriteCond expr "-R '192.168.1.0/24'"
Run Code Online (Sandbox Code Playgroud)

还提供了以下更长的表单,但文档表明效率较低:

RewriteCond expr "%{REMOTE_ADDR} -ipmatch '192.168.1.0/24'"
Run Code Online (Sandbox Code Playgroud)

这使得您的示例的完整解决方案如下:

RewriteEngine On
RewriteCond %{REQUEST_URI} !/maintenance$
RewriteCond expr "! -R '12.345.678.90/28'"
RewriteRule $ /maintenance [R=302,L]
Run Code Online (Sandbox Code Playgroud)