Перенаправить диапазон 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

4 ответа

Решение

Вы, вероятно, хотите %{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]$

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

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

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

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

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

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

Другие вопросы по тегам