【问题标题】:Redirect a range of IPs using RewriteCond使用 RewriteCond 重定向一系列 IP
【发布时间】:2012-07-24 02:30:59
【问题描述】:

目前我正在重定向除 IP 12.345.678.90 之外的所有用户,使用:

RewriteEngine On
RewriteCond %{REQUEST_URI} !/maintenance$
RewriteCond %{REMOTE_HOST} !^12\.345\.678\.90
RewriteRule $ /maintenance [R=302,L]

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

Allow from 123.45.678.90/28

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

RewriteCond %{REMOTE_HOST} !^12\.345\.678\.90/28

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

    您可能希望 %{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]$
    

    【讨论】:

    • 如果你想匹配更大的范围——例如,不确定的第三和第四个八位字节——你可以做!^123\.45\.[0-9]{1,3}\.[0-9]{1,3}$——这将匹配第三和第四个八位字节中0-255之间的任何数字,但让您定义 IP 的前半部分。最近不得不在我正在开发的 WordPress 上执行此操作,以允许 WordPress JetPack 服务器连接到 XML-RPC 端点,同时仍将常规访问者重定向到单独的站点。
    • 效率很低RewriteCond, @zts answer is way better
    • 这个问题在 Apache 2.2 被广泛使用时得到了回答,现在一切都是 2.4,所以使用 expr 会更好
    【解决方案2】:

    如果您使用的是 Apache HTTPD 2.4 或更高版本,则可以使用 expressions 将 REMOTE_ADDR 与 CIDR 掩码匹配。

    简写如下:

    RewriteCond expr "-R '192.168.1.0/24'"
    

    以下更长的形式也可用,但文档表明它的效率较低:

    RewriteCond expr "%{REMOTE_ADDR} -ipmatch '192.168.1.0/24'"
    

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

    RewriteEngine On
    RewriteCond %{REQUEST_URI} !/maintenance$
    RewriteCond expr "! -R '12.345.678.90/28'"
    RewriteRule $ /maintenance [R=302,L]
    

    【讨论】:

    • 问题:你能举个简短的例子吗?尚不清楚它是如何引用%{REMOTE_ADDR},而%{REMOTE_ADDR} 以更长的形式明确指出。
    • @plusjeff 我不确定你的意思 - 上面包含了简短形式的示例。从链接的文档中,-R 是Same as "%{REMOTE_ADDR} -ipmatch ...", but more efficient
    • -R 是否代表%{REMOTE_ADDR}?如果是这样,如何使用高性能简短形式来检查不同的变量(即说我想用简短形式检查一个名为%{CLIENT_IP} 的变量?如果我使用不同的变量,我是否总是必须使用更长的形式?
    • 是的,对于其他变量,您必须使用较长的形式。 -R 专门用于REMOTE_ADDR
    【解决方案3】:

    我喜欢使用以下允许部分地址匹配的方法。在您的virtualHost/htaccess 文件中

    SetEnvIf HOST "siteYouAreworkingON.com" ACCESS_CONTROL<br>
    SetEnvIf Remote_Addr "list of full or partia ipadresses separated by |"<br>
    RewriteCond %{ENV:ACCESS_CONTROL} 1<br>
    RewriteRule .* http://gohere.instead [L,R]
    

    希望对你有帮助。

    【讨论】:

      【解决方案4】:

      虽然这是一个老问题,但我发现它仍然非常相关。以下是允许 CIDR 表示法的替代方法(示例在虚拟主机 apache conf 文件中):

      <VirtualHost *:80>
          .
          .
          .
          <Files maintenance>
              Require all denied
              Require ip 12.345.678.90/28
          </Files>
          .
          .
          .
      </VirtualHost>
      

      作为旁注,我怀疑,在没有进行任何测试或发现任何证据的情况下,这种方法比提到的RewriteCond expr "-R '192.168.1.0/24'" 方法“更快”。

      原因很简单,在这个高层次上似乎涉及的计算步骤较少。

      注意来自被拒绝 IP 的请求者将看到“Permission denied”或“Forbidden”类型的响应。您可以通过添加以 200/OK 响应的自定义 404 页面来使其更漂亮(这样 Google 不会惩罚您的域)。 200/OK 必须是自定义 404 页面的第一行。例如在 PHP 中,第一行是:

      <?php header("Status: 200 OK"); ?>
      

      您希望对重定向到的合法页面执行此操作。实际的 404 应该以 404 响应,以防止我们在路上遇到大量无用的搜索引擎结果。

      【讨论】:

        【解决方案5】:

        在 .htaccess 中试试这个。它正在工作。

        RewriteCond %{REMOTE_ADDR} !^123\.456\.789\.[0-255]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-05-30
          • 2013-07-17
          • 1970-01-01
          • 2017-08-13
          • 1970-01-01
          • 2012-04-22
          • 2013-09-23
          相关资源
          最近更新 更多