使用 RewriteCond 重定向一系列 IP

     2023-03-04     238

关键词:

【中文标题】使用 RewriteCond 重定向一系列 IP【英文标题】:Redirect a range of IPs using RewriteCond 【发布时间】: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

【问题讨论】:

【参考方案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]

【讨论】:

强制 SSL 重定向 - Apache/IHS RewriteCond 和 RewriteRule

】强制SSL重定向-Apache/IHSRewriteCond和RewriteRule【英文标题】:ForceSSLredirect-Apache/IHSRewriteCondandRewriteRule【发布时间】:2012-05-0321:22:12【问题描述】:我正在尝试设置一个重写规则,该规则将强制进入端口80的所有请求强制使用HTTPS。... 查看详情

使用基于浏览器语言的 htaccess 从和到子域重定向

...要根据用户的语言重定向主页中的用户。我想我必须使用RewriteCond%HTTP:Accept-Language但我想不通。我的最后一次尝试:重写引擎开启RewriteCond%HTT 查看详情

如果任何目录具有特定的查询字符串,则重定向(代码片段)

...个wordpress网站,如果这应该有所作为。这是我尝试过的:RewriteCond%REQUEST_URI^/(.+)RewriteCond%QUERY_STRING^redirectme=1$RewriteRule^/?$http://example.com/?[R=301,L]和RewriteCond%REQUEST_URI^/(.+)RewriteCond%QUERY_STRING^redirectme=1$RewriteRule(.*)http://example.com/?[R=301,L]... 查看详情

维护重定向

OptionsFollowSymLinks RewriteEngineOn RewriteCond%REQUEST_URI!/maintenance.html$RewriteCond%REQUEST_URI!/marrowtanance.png$ RewriteRule$/maintenance.html[R=302,L] 查看详情

RewriteCond REQUEST_URI - ^ 没有按预期工作

】RewriteCondREQUEST_URI-^没有按预期工作【英文标题】:RewriteCondREQUEST_URI-^doesn\'tworkasexpected【发布时间】:2012-09-1001:23:22【问题描述】:我正在使用codeigniter构建一个站点。我在.htaccess文件中有一系列重写条件和规则。第一组规则根... 查看详情

重定向 - 总共 4 个参数

...的成就。这是我目前所拥有的:##1strulewithoneparameter:$id--RewriteCond%ENV:REDIRECT_STATUS^$RewriteCond%QUERY_STRIN 查看详情

.htaccess 使用 php slug 重定向

】.htaccess使用phpslug重定向【英文标题】:.htaccessredirectwithphpslug【发布时间】:2016-03-0215:45:52【问题描述】:我的重写代码是:RewriteEngineonRewriteCond%THE_REQUEST^[A-Z]3,9\\/(.*)index\\.php($|\\|\\?)RewriteRule^/%1[R=301,L]RewriteCond%REQUEST_FILE 查看详情

使用 php 只需一次地理重定向用户

】使用php只需一次地理重定向用户【英文标题】:Georedirectuserjustonceusingphp【发布时间】:2013-06-0414:02:18【问题描述】:当用户登陆site.com/redirect.php时,我可以轻松使用此脚本他们根据地理IP被重定向到适当的TLD但是当我在“index.... 查看详情

如何将.htm重定向到特定域的非.htm?(代码片段)

我想重定向“简单”这样的东西:RewriteCond%HTTP_HOST^(www.)?old-domain.com$[NC]RewriteRule^(.*)contact.htm$https://new-domain.com/contact/[R=301,L]但这不起作用。我必须使用RewriteCond,因为我正在处理一个多域实例。有人能告诉我什么是缺失或错误的... 查看详情

重定向301多明尼奥斯

Tipicocasodesitiocondosdominios,ypaginasconparámetros.RewriteCond%HTTP_HOST^dominio.com.ar$[OR]RewriteCond%HTTP_HOST^www.dominio.com.ar$RewriteRule^(.*)$http://www.dominio.com/$1[R=301,L] 查看详情

将 ssl 重定向到非 ssl

...运气。这可以通过htaccess完成吗?重写引擎开启RewriteBase/RewriteCond%HTTPS开启RewriteCond%HTTP_HOSTwww.mydomain.org重写规则(.*)http://www.mydo 查看详情

所有页面的joomla301重定向

RewriteEngineOn ##########Begin-301Redirect#RewriteCond%THE_REQUEST^[A-Z]3,9/([^/]+/)*(index|home).html?HTTP/RewriteRule^(([^/]+/)*)(index|home).html?$http://www.yoursite.com/$1[R=301,L]#RewriteCond%THE_REQUEST!^POSTRewriteCond%THE_REQUEST^[A-Z]3,9/([^/]+/)*index.phpHTTP/RewriteCond%SERVER_PORT... 查看详情

只允许某些ip地址使用mod_rewrite访问网站?(代码片段)

...所以我们有这个.htaccess文件来尝试让它工作:RewriteEngineonRewriteCond%(REMOTE_ADDR)!^123.123.123.123RewriteCond%(REMOTE_ADDR)!^124.124.124.124RewriteCond%REMOTE_ADDR!^125.125.125.125RewriteCond%REMOTE_ADDR!^126.126.126.126RewriteCond%REMOTE_ADDR!^127.127.127.127RewriteCond%REMOTE_AD... 查看详情

在表达式引擎重定向循环上强制使用 HTTPS

...,但是当我添加任何这些规则时,它会显示重定向循环。RewriteCond%HTTPSoffRewriteRule 查看详情

将非 www 重定向到 www 以获取 https

】将非www重定向到www以获取https【英文标题】:RedirectNON-wwwtowwwforhttps【发布时间】:2016-09-1111:36:39【问题描述】:我有以下重定向RewriteCond%HTTP_HOST!^www\\.RewriteRule^(.*)$http://www.%HTTP_HOST/$1[R=301,L]RewriteCond%HTTPS!onRewriteRule(.*)https://%HT 查看详情

.htaccess https 到 http 重定向与现有规则冲突

...】:目前我们在.htaccess中有这个规则RewriteEngineon<br>RewriteCond%REQUEST_URI!^/site/RewriteCond%REQUEST_FIL 查看详情

如何将子站点重定向到另一个子站点

...4:59:14【问题描述】:我有一个网站example.com。我正在尝试使用.htaccess将www.example.com/series重定向到www.example.com/product。以及附加到产品的系列之后的任何操作,例如www.example.com/series/ 查看详情

将非 WWW 重定向到 WWW URL

...ss中添加了以下代码RewriteEngineonOptions+FollowSymlinksRewriteBase/RewriteCond% 查看详情