Перенаправить диапазон 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]
Надеюсь, поможет.