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