it-roy-ru.com

Перенаправить диапазон IP-адресов с помощью RewriteCond

В настоящее время я перенаправляю всех пользователей, кроме 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
19
xylar

Возможно, вы хотите, чтобы %{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]$
21
Jon Lin

Если вы используете Apache HTTPD 2.4 или более позднюю версию, вы можете использовать выражения , чтобы сопоставить 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]
19
zts

Хотя это старый вопрос, я нахожу его все еще очень актуальным. Альтернатива, которая разрешает нотацию CIDR, заключается в следующем (пример находится в conf-файле Apache virtualhost):

<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-адреса увидит ответ типа «Отказано в доступе» или «Запрещено». Вы можете сделать это красивее, добавив страницу 404, которая отвечает 200/OK (таким образом, Google не будет штрафовать ваш домен). 200/OK должен быть первой строкой вашей пользовательской страницы 404. Например, в PHP первая строка будет выглядеть так:

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

Вы хотите сделать это для легальной страницы, на которую вы перенаправляете. Фактические 404 должны отвечать 404, чтобы мы не получили тонну бесполезных результатов поиска в будущем.

1
J-a-n-u-s

Мне нравится использовать следующее, что позволяет частичное сопоставление адресов. В вашем 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]

Надеюсь, поможет.

0
Roberto Sanchez