Рейтинг:1

Как запретить доступ ко всем IP-адресам, кроме одного, и разрешить доступ к определенным URI для всех с помощью Apache 2.4

флаг cz

Мне нужно заблокировать доступ к сайту из публики, но разрешить один IP-адрес. И мне нужно предоставить доступ к паре URI-ов для публики. Но ничего не работает - либо все блокируется, либо все открыто.

Упрощенная выдержка из конфига Apache:

<Directory /site/dir>
    Require ip 1.2.3.4
</Directory>

<Location "/open/for/public1">
    Require all granted
</Location>
<Location "/open/for/public2">
    Require all granted
</Location>

Теперь все блокируется.

Также пробовал со старым синтаксисом:

<Location "/open/for/public1">
    Order allow,deny
    allow from all
</Location>

Все тот же.

Я пытался заблокировать сайт с помощью директивы <Location "/"> (вместо директивы <Directory>), но тогда public1 и public2 также блокируются.

Я пробовал с:

SetEnvIf Request_URI "^/open/for/public1$" NO_AUTH_NEEDED=1
<Каталог /сайт/каталог>
    Порядок Запретить, Разрешить
    Запретить от всех
    Разрешить из env=NO_AUTH_NEEDED
    Разрешить с 1.2.3.4
</Каталог>

Не работает, все блокируется.

Приветствуются все предложения

Chris avatar
флаг it
*Я пытался заблокировать сайт с помощью директива (вместо директива), но тогда public1 и public2 также блокируются*. Я только что протестировал первый метод с 3 блоками «Местоположение» вместо «Каталога», как в первом, и это работает, я получаю блокировку везде, кроме местоположения, которое я определил.
goldie avatar
флаг cz
@Chris Спасибо, что посмотрели. Пробовал еще раз, все равно все блокируется. Может быть, это приказ директив? Не могли бы вы опубликовать свою конфу?
Рейтинг:1
флаг cz

В конечном итоге мне помогли правила Apache Rewrite и Оповещение LogLevel переписано: trace6. В этом случае оказывается, что в дополнение к некоторым файлам .htaccess (я не думаю, что это имело какой-либо эффект) в коде были некоторые внутренние перенаправления. В итоге я использовал в разделе VirtualHost что-то вроде:

RewriteCond %{REMOTE_ADDR} !1.2.3.4
RewriteCond %{REQUEST_URI} !^/open/for/public(.*) [NC]
Правило перезаписи .* - [F]

и в .htaccess:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
Правило перезаписи. index.php [КОНЕЦ]

я добавил, что [КОНЕЦ] и кажется, что это очень важно, так как без него движок Rewrite продолжает работать и почему-то с некоторыми внутренними редиректами (из журнала Apache: ...внутреннее перенаправление с помощью /index.php [ВНУТРЕННЕЕ ПЕРЕНАПРАВЛЕНИЕ]) URL-адрес искажается и Правило перезаписи. - [F]* срабатывает каждый раз.

Рейтинг:0
флаг it

В первом примере, я думаю, вас заблокировали, потому что Каталог директива берет на себя Место расположения директивы:

<Directory /site/dir>
    Require ip 1.2.3.4
</Directory>

<Location "/open/for/public1">
    Require all granted
</Location>

<Location "/open/for/public2">
    Require all granted
</Location>

Есть много способов добиться желаемого.

  • Первый способ, который работает для меня, использует Место расположения только директивы (проверено с реальным и фактическим IP-адресом, общедоступный URL-адрес был реальными файлами в моей системе):

      DocumentRoot /сайт/каталог
    
      <Местоположение />
          Требовать айпи 1.2.3.4
      </Расположение
    
      <Расположение "/open/for/public1">
          Требовать все предоставленные
      </местоположение>
    
      <Расположение "/open/for/public2">
          Требовать все предоставленные
      </местоположение>
    

    С Место расположения директивы, порядок имеет значение. В следующем примере меня везде блокируют, потому что последний блок имеет приоритет перед остальными:

      <Расположение "/open/for/public1">
          Требовать все предоставленные
      </местоположение>
    
      <Расположение "/open/for/public2">
          Требовать все предоставленные
      </местоположение>
    
      <Местоположение />
          Требовать айпи 1.2.3.4
      </Расположение
    
  • Я также тестировал с помощью Каталог директивы. В таком случае, порядок не имеет значения (директивы применяются в порядке кратчайшего соответствия первым)

      <Directory /site/dir>
          Require ip 1.2.3.4
      </Directory>
    
      <Directory "/site/dir/open/for/public1">
          Require all granted
      </Location>
    
     <Directory "/site/dir/open/for/public2">
         Require all granted
     </Directory >
    

    Чтобы выбрать между Каталог или же Место расположения директивы см. рекомендация апача.

  • Вот еще один пример, протестированный с использованием mod_rewrite:

      <Directory /var/www/site/>
    
          # first, allow all 
          Require all granted
    
          # Then enable rewrite engine   
          RewriteEngine On
    
          # Requests that: 
          # do not start with 'test' (test is a real folder supposed open to public)
          RewriteCond %{REQUEST_URI} !^/test
    
          # AND that do not start with 'another_test'
          RewriteCond %{REQUEST_URI} !^/another_test
    
          # AND ...
    
          # AND that do not come from given IP
          RewriteCond "%{REMOTE_ADDR}"  !1.2.3.4
    
          # are blocked (403 Forbidden)
          RewriteRule .* - [F]
      </Directory>
    
goldie avatar
флаг cz
Спасибо, что указали мне правильное направление! После нескольких дней (!) биться головой о стену я решил попробовать это с правилами перезаписи и предупреждением LogLevel rewrite:trace6. И похоже, что в дополнение к некоторым причудливым файлам .htaccess в коде есть несколько внутренних перенаправлений. В итоге я использовал что-то вроде: * RewriteCond %{REMOTE_ADDR} !1.2.3.4 RewriteCond %{REQUEST_URI} !^/open/for/public(.*) [NC] Правило перезаписи .* - [F,END]

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.