Заборонити всі, дозволити лише один IP через htaccess


156

Я намагаюся заперечувати все і дозволяти лише для однієї ІР. Але я хотів би, щоб наступний htaccess працював для цього єдиного IP-адреси. Я не знаходжу способу, щоб обидва працювали: заперечувати все та дозволяти лише одне, плюс наступні варіанти:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    #Removes access to the system folder by users.
    #Additionally this will allow you to create a System.php controller,
    #previously this would not have been possible.
    #'system' can be replaced if you have renamed your system folder.
    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    #When your application folder isn't in the system folder
    #This snippet prevents user access to the application folder
    #Submitted by: Fabdrol
    #Rename 'application' to your applications folder name.
    RewriteCond %{REQUEST_URI} ^application.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    #Checks to see if the user is attempting to access a valid file,
    #such as an image or css document, if this isn't true it sends the
    #request to index.php
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>

<IfModule !mod_rewrite.c>
    # If we don't have mod_rewrite installed, all 404's
    # can be sent to index.php, and everything works as normal.
    # Submitted by: ElliotHaughin

    ErrorDocument 404 /index.php
</IfModule>

Чи є спосіб зробити цю роботу?

Відповіді:


356
order deny,allow
deny from all
allow from <your ip> 

95
ПРИМІТКА! Apache чутливий до простору в htaccess. Не допускайте пробілу між запереченням, дозволяйте. Тобто не пишіть наказ заперечуйте, дозволяйте.
H.Rabiee

2
ІНФОРМАЦІЯ: - він працює і для IPv6! просто додайте ще один рядок зallow from yourIPv6
jave.web

Чи можливо в nginx?
shgnInc

10
Примітка до 2.4 документа : Директиви "Дозволити", "Заборонити" та "Порядок", надані mod_access_compat, застарілі та відпадуть у майбутній версії. Ви повинні уникати їх використання та уникати застарілих навчальних посібників, що рекомендують їх використання.
Мартін Шнайдер

4
Як зазначав @ MA-Maddin, - тоді mod_access_compat застаряється. У цій публікації показано, як це робити в нових версіях. І слід також враховувати, якщо сервер використовує проксі, оскільки тоді він відображатиме проксі-IP для відвідувача. Цей пост пропонує вирішення цього питання.
Зет

115

Я знаю, що на це питання вже є прийнята відповідь, але документація Apache говорить:

Директиви "Дозволити, заборонити" та "Порядок", надані mod_access_compat, застаріли і відійдуть у майбутній версії. Ви повинні уникати їх використання та уникати застарілих навчальних посібників, що рекомендують їх використання.

Отже, більш надійною відповіддю буде:

<RequireAll>
    Require ip xx.xx.xx.xx yy.yy.yy.yy
</RequireAll>

Сподіваємось, я допоміг не допустити, щоб ця сторінка стала однією з тих "застарілих навчальних посібників". :)


Куди ми розмістимо наш IP?
Гері Карлайл Кук

1
Шлях! Це має бути прийнятим рішенням, оскільки воно не тільки працює, але і захищає від часу.
6опко

Інша відповідь не допомогла в моїй ситуації. Але це зробив. Дякуємо, що оновили стару тему.
Йоганн Дік

1
Приклад цієї відповіді дозволяє отримати доступ з двох IP-адрес? Отже, щоб додати декілька IP-адрес, ми просто помістимо пробіл між ними? Чи можете ви розмістити Require ipдекілька рядків, щоб зробити їх читабельнішими для користувачів або всі IP-адреси повинні бути в одній лінії?
Hastig Zusammenstellen

якби ви користувались цим, як би ви переадресували на нову тимчасову сторінку, як це було зроблено з деяких відповідей?
rudtek

39

Це можна покращити, використовуючи директиву, розроблену для цього завдання.

ErrorDocument 403 /specific_page.html
Order Allow,Deny
Allow from 111.222.333.444

Де 111.222.333.444 - ваша статична IP-адреса.

Під час використання директиви "Дозволити, заборонити" запити повинні відповідати або "Дозволити" або "Заборонити", якщо жодне з них не виконано, у запиті буде відхилено.

http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html#order


1
як додати uRL acustom?
secondsight

32

Трохи модифікована версія вищезазначеного, включаючи користувацьку сторінку, яку потрібно відображати тим, кому заборонено доступ:

ErrorDocument 403 /specific_page.html
order deny,allow
deny from all
allow from 111.222.333.444

... і таким чином ті запити, які не надходять від 111.222.333.444, побачать specific_page.html

(розміщення цього коментаря виглядає жахливим, оскільки нові рядки губляться)


Привіт. У мене такий самий код, як у вас у моєму .htaccess, але я постійно отримую помилку 500. Сторінка, яку я вказав, називається test.htmlі знаходиться в тій самій папці, що і .htaccess. Однак я не можу побачити журнали (заборонено з сервера). Чи маєте ви уявлення, чому у мене могла виникнути ця проблема? Коли я отримую шлях до файлу через клієнт ftp, він мені повідомляє, /test.htmlтому шлях не повинен бути проблемою, правда?
Musterknabe

Крім того, помилка 500 виникає навіть тоді, коли я прокоментував рядок із документом помилки. Тож це не повинно бути проблемою. Чи є причина, що інші 3 рядки не змогли працювати? У своєму .htaccess у мене є ще три рядки, куди я перенаправляю не-www на www, але це все. Але я також отримую помилку, коли у мене
ТОЛЬКІ

Як додати URL-адресу привчання?
secondsight

8

Удосконалюючи трохи більше попередніх відповідей, вашим користувачам може бути показана сторінка технічного обслуговування під час виконання змін на сайті:

ErrorDocument 403 /maintenance.html
Order Allow,Deny
Allow from #.#.#.#

Де:


Коли я використовую ErrorDocument 403, я отримую додаткову помилку 403 для цього файла vzdrže.html, оскільки він не може отримати доступ до цього файлу. Чи є у вас рішення для цього?
Здравко

3

Просто на додаток до відповіді @David Brown, якщо ви хочете заблокувати IP-адресу, спочатку потрібно дозволити всім потім блокувати IP-адреси як такі:

    <RequireAll>
      Require all granted
      Require not ip 10.0.0.0/255.0.0.0
      Require not ip 172.16.0.0/12
      Require not ip 192.168
    </RequireAll>

First line allows all
Second line blocks from 10.0.0.0 to 10.255.255.255
Third line blocks from 172.16.0.0 to 172.31.255.255
Fourth line blocks from 192.168.0.0 to 192.168.255.255

Ви можете використовувати будь-яку з зазначених вище позначень для задоволення потреб CIDR.


Дякую, це правильний спосіб боротьби з Apache 2.4!
Олександр Павич

2

Ви можете використовувати наступне в htaccess, щоб дозволити та заборонити доступ до свого сайту:

SetEnvIf remote_addr ^1\.2\3\.4\.5$ allowedip=1

Order deny,allow
deny from all
allow from env=allowedip

Спочатку ми встановлюємо змінну ENV allowedip , якщо адреса IP клієнта відповідає шаблоном, якщо шаблон збігається , то змінна оточення allowedip присвоюється значення 1 .

На наступному кроці ми використовуємо Дозволити, заборонити директиви, щоб дозволити та заборонити доступ до сайту. Order deny,allowпредставляє порядок denyі allow. deny from allцей рядок повідомляє серверу відмовити всім. останній рядок allow from env=allowedipдозволяє отримати доступ до однієї ip адреси, для якої ми встановлюємо змінну env.

Замініть 1\.2\.3\.4\.5дозволену IP-адресу.

Відгуки:


1
Які плюси використання цього замість просто дозволити 324.234.22.1?
Беррі М.

2

Мені не вдалося використати метод 403, тому що я хотів зображення сторінки обслуговування та сторінки у підпапці на своєму сервері, тому застосував такий підхід для переадресації на "сторінку технічного обслуговування" для всіх, крім однієї IP *

RewriteEngine on
RewriteCond %{REMOTE_ADDR} !**.**.**.*
RewriteRule !^maintenance/ http://www.website.co.uk/maintenance/ [R=302,L]

Джерело: Створення холдингової сторінки для приховування вашого блогу WordPress


Це рішення найпростіше - я вважаю за краще
Герфрід

1

Ви можете мати більше одного IP або навіть якийсь інший тип дозволу, наприклад, користувач, ім'я хоста, ... більше інформації тут https://www.askapache.com/htaccess/setenvif/

SetEnvIf remote_addr ^123.123.123.1$ allowedip=1
SetEnvIf remote_addr ^123.123.123.2$ allowedip=1
SetEnvIf remote_addr ^123.123.123.3$ allowedip=1
SetEnvIf remote_addr ^123.123.123.4$ allowedip=1

Order deny,allow
deny from all
allow from env=allowedip

0

Якщо ви хочете використовувати mod_rewrite для контролю доступу, ви можете використовувати умови, такі як агент користувача, http-референс, віддалений addr тощо.

Приклад

RewriteCond %{REMOTE_ADDR} !=*.*.*.* #you ip address
RewriteRule ^$ - [F]

Відгуки:


0

Додайте таку команду у .htaccess файл. І помістіть цей файл у вашу папку htdocs.

Order Deny,Allow
Deny from all
Allow from <your ip> 
Allow from <another ip> 

0
ErrorDocument 403 /maintenance.html
Order Allow,Deny
Allow from #:#:#:#:#:#

Для мене це, здається, працює (Використовуючи IPv6, а не IPv4). Я не знаю, чи відрізняється це для деяких веб-сайтів, але для мого це працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.