Подтвердить что ты не робот

Перенаправление диапазона 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
4b9b3361

Ответ 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]$

Ответ 2

Если вы используете 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]

Ответ 3

Хотя это старый вопрос, я нахожу его все еще очень актуальным. Альтернатива, которая разрешает нотацию 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, чтобы мы не получили тонну бесполезных результатов поиска в будущем.

Ответ 4

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

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

Ответ 5

Попробуйте это в .htaccess. Это работает.

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