Перенаправить ряд IP-адресов, используя RewriteCond

18

В настоящее время я перенаправляю всех пользователей, кроме 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
    
задан xylar 25.07.2012 в 17:37
источник

4 ответа

19

Вероятно, вы хотите, чтобы %{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]$
    
ответ дан Jon Lin 25.07.2012 в 18:53
источник
15

Если вы используете 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]
    
ответ дан zts 16.03.2016 в 00:32
источник
  • Вопрос: Не могли бы вы привести пример в краткой форме? Непонятно, как он ссылается на% {REMOTE_ADDR}, тогда как% {REMOTE_ADDR} явно отмечен в более длинной форме. –  jeffmaher 04.05.2017 в 22:19
  • @plusjeff Я не уверен, что вы имеете в виду - пример короткой формы включен выше. Из связанной документации, -R совпадает с «% {REMOTE_ADDR} -ipmatch ...», но более эффективен. –  zts 05.05.2017 в 17:29
  • Является ли -R в краткой форме представителем% {REMOTE_ADDR}? Если да, то как использовать короткую форму высокой производительности для проверки другой переменной (например, я хочу проверить переменную с именем% {CLIENT_IP} с короткой формой? Если я использую другую переменную, всегда ли я должен использовать более длинная форма? –  jeffmaher 05.05.2017 в 22:02
  • Да, для других переменных вам придется использовать более длинную форму. -R специально для REMOTE_ADDR. –  zts 08.05.2017 в 13:03
0

Хотя это старый вопрос, я считаю его очень актуальным. Альтернативой, которая позволяет обозначать CIDR, является следующее (пример в файле confhost apache virtualhost):

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

Как оповещение, I подозреваемый , не проведя никакого тестирования или не обнаружив никаких доказательств, этот метод «быстрее», чем упомянутые методы RewriteCond expr "-R '192.168.1.0/24'" .

Это по той простой причине, что на этом высоком уровне, по-видимому, меньше задействованных шагов.

N.B. запросчик из IP, который отклонен, увидит ответ типа «Разрешение отказа» или «Запрещено». Вы можете сделать это красивее, добавив на пользовательскую страницу 404, на которую отвечает 200 / OK (таким образом Google не будет наказывать ваш домен). 200 / OK должна быть первой строкой вашей пользовательской страницы 404. Например, в PHP первая строка будет читать:

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

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

    
ответ дан J-a-n-u-s 23.04.2018 в 18:05
источник
0

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

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

    
ответ дан Roberto Sanchez 06.12.2016 в 18:13
источник