Apache 2.4 ограничивает URL для определенных IP-адресов

14

Я пытаюсь ограничить доступ к конкретному URL-адресу за пределами сети только определенными IP-адресами. Когда пользователь снаружи пытается получить доступ к этому URL, а не из списка IP-адресов, он должен быть перенаправлен на домашнюю страницу.

Это то, что я пытался до сих пор без какой-либо удачи. Последняя часть перенаправляет всех на домашнюю страницу независимо от IP.

<Location "/secret">
#    <If "%{REMOTE_ADDR} != -ipmatch '123.123.123.123/255.255.255.255'">
#    Redirect 303 "/secret" /
#    </If>

RewriteCond "%{REMOTE_ADDR}" "!123\.123\.123\.123"
RewriteRule .* / [R,L]

LogLevel debug rewrite:trace6
</Location>

PS: URL / secret на самом деле является виртуальным URL и физически не существует на диске.

Денис Рендлер
источник
если заявления закомментированы? Включить перезапись - RewriteEngine On?
user9517
Утверждение <If> - это одна из версий, которую я попробовал. Директива RewriteEngine On объявлена ​​ранее. Вот почему он перенаправляет всех
Денис Рендлер,
1
Я думаю, что вы должны снять пометку с выбранного ответа, потому что он недействителен для Apache 2.4, как вы и просили (он дает неверную информацию проходящим людям)
Erenor Paz

Ответы:

4

Используйте Order, Denyи allowуказать , кто имеет доступ к виртуальному хосту или местоположению.

<VirtualHost *:80>
    ServerName example.net
    DocumentRoot /docroot

    <Directory "/docroot">
        Order Deny,Allow
        Deny from all
        Allow from 10.10.10.10
        Allow from 10.10.11.0/24
    </Directory>   
</VirtualHost>

Когда дело доходит до перенаправления, подумайте о специальной странице ошибок . Это гораздо более общий вопрос, поскольку каждый несанкционированный доступ должен вызывать ошибку 403 и, следовательно, может быть легко оценен.

Я никогда не делал этого с apache, но использую эту стратегию с nginx. Для Apache что-то вроде этого должно сделать:

ErrorDocument 403 http://homepage.example.com

Пользовательские документы об ошибках настраиваются с использованием директивы ErrorDocument, которую можно использовать в контексте global, virtualhost или directory. Он может использоваться в файлах .htaccess, если для параметра AllowOverride установлено значение FileInfo. (из документов Apache)

ansi_lumen
источник
2
Это похоже на набор конфигурации Apache httpd 2.2. Будет ли все еще работать с 2.4?
user9517
По крайней мере, ErrorDocumentчасть из 2,4 документов. Я не использую Apache, так как Nginx вокруг, но предполагается , что Order, Denyи Allowвсе еще вокруг в апач 2,4
ansi_lumen
Спасибо, но я не помогаю. Я забыл упомянуть, но я обновил вопрос, / секретный URL на самом деле является виртуальным URL и физически не существует на диске. Сам URL-адрес переписан с index.php, поэтому я использовал директиву <Location>.
Денис Рендлер,
4
Этот синтаксис устарел в Apache 2.4
Luca Reghellin
1
Почему это принятый ответ? Это для Apache 2.2, а не 2.4, как следует из вопроса ... Это не будет работать.
Джереми
23

Параметры Порядок, Запретить и Разрешить были заменены в Apache 2.4 на

<Directory /var/www/mysite.com/htdocs/public>
    Require all granted
</Directory>

Вы можете явно ограничить адреса с помощью следующего:

<Directory /var/www/mysite.com/htdocs/public>
    Require all granted
    Require not ip 192.168.0.1
</Directory>

Также верно и обратное, чтобы ограничить все и разрешить подмножеству использовать следующее:

<Directory /var/www/mysite.com/htdocs/public>
    Require host example.com
    Require ip 192.168.0.1
</Directory>

Более подробная информация доступна в документации по контролю доступа Apache 2.4.

Что касается вашего вопроса (отредактированного мной из-за отсутствия точек для добавления комментария), вы можете просто установить ErrorDocument с индексом, заданным как URL-путь:

<Directory /var/www/mysite.com/htdocs/public>
    Require host example.com
    Require ip 192.168.0.1
    ErrorDocument 401 /index.html
</Directory>

Надеюсь это поможет!

Linztm
источник
Спасибо, @Linztm! Но это решает только частично мою проблему. Я не хочу блокировать пользователя, но и перенаправить его на домашнюю страницу.
Денис Рендлер,
Кажется, что он работает с директивой ErrorDocument, только если я предоставлю полный URL, включая домен и протокол. Я буду исследовать дальше. Благодарю.
Денис Рендлер,
Я нашел, по крайней мере, один случай, когда вам нужно использовать allowхотя и устаревшие, Require 127.0.0.1 но разрешить доступ по внешнему адресу с локальной машины, где разрешить синтаксис разрешить только с 127 адресов.
Алексей Мартианов,
2

Для Apache 2.4 вы можете использовать <RequireAny>. Вы можете сделать это в файле vhost или .htaccess ....

SetEnvIF IP xxx.xxx.xxx.xxx AllowThisIP  # Or X-Real-IP
SetEnvIF IP yyy.yyy.yyy.yyy AllowThisIP
<RequireAny>
  Require env AllowThisIP
  Require host example.com
</RequireAny>

Apache docs https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#requireany

MontyThreeCard
источник