Puncte:1

Cum să interziceți accesul la toate IP, cu excepția unuia, și să permiteți accesul la anumite URI-uri pentru toți cu Apache 2.4

drapel cz

Trebuie să blochez accesul la site de la public, dar să permit o adresă IP. Și trebuie să dau acces la câteva URI-uri pentru public. Dar nimic nu funcționează - fie totul este blocat, fie totul este deschis.

Extras simplificat din Apache conf:

<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>

Acum totul este blocat.

Am încercat și cu sintaxă veche:

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

Inca la fel.

Am încercat să blochez site-ul cu directiva <Location "/"> (în loc de directiva <Directory>), dar apoi public1 și public2 sunt de asemenea blocate.

Am incercat cu:

SetEnvIf Request_URI "^/open/for/public1$" NO_AUTH_NEEDED=1
<Director /site/dir>
    Comanda refuza, permite
    Negați de la toți
    Permite de la env=NO_AUTH_NEEDED
    Permite de la 1.2.3.4
</Director>

Nu funcționează, totul este blocat.

Toate sugestiile sunt binevenite

Chris avatar
drapel it
*Am încercat să blochez site-ul cu directivă (în loc de directivă), dar apoi public1 și public2 se blochează și ele*. Tocmai am testat prima metodă cu 3 blocuri `Locație` în loc de `Directory` ca pentru prima și asta funcționează, sunt blocat peste tot, cu excepția locației pe care am definit-o.
goldie avatar
drapel cz
@Chris Mulțumesc pentru că ai aruncat o privire. Am încercat încă o dată, tot se blochează. Poate este ordinea directivelor? Ai putea posta conf.?
Puncte:1
drapel cz

Ceea ce m-a ajutat în cele din urmă au fost regulile Apache Rewrite și Rescriere alertă LogLevel:trace6. În acest caz, se pare că pe lângă unele fișiere .htaccess (nu credeam că au avut vreun efect) au existat și câteva redirecționări interne în cod. Așa că am ajuns să folosesc în secțiunea VirtualHost ceva de genul:

RewriteCond %{REMOTE_ADDR} !1.2.3.4
RewriteCond %{REQUEST_URI} !^/open/for/public(.*) [NC]
RewriteRule .* - [F]

și în .htaccess:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [END]

am adaugat asta [SFÂRŞIT] și se pare că este foarte important, deoarece fără el motorul de rescriere continuă și din anumite motive, cu unele redirecționări interne (din jurnalul Apache: ...redirecționare internă cu /index.php [REDIRECT INTERN]) URL-ul este alterat și RewriteRule . - [F]* trage de fiecare dată.

Puncte:0
drapel it

În primul exemplu, cred că ești blocat deoarece Director directiva preia Locație directive:

<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>

Există multe modalități de a obține ceea ce îți dorești.

  • Un prim mod care funcționează pentru mine este utilizarea Locație numai directivele (testate cu IP real și factice, URL-urile publice erau fișiere reale pe sistemul meu):

      DocumentRoot /site/dir
    
      <Locație />
          Necesită ip 1.2.3.4
      </Locație
    
      <Locație „/open/for/public1”>
          Solicitați toate acordate
      </Locație>
    
      <Locație „/open/for/public2”>
          Solicitați toate acordate
      </Locație>
    

    Cu Locație directive, ordinea contează. În exemplul următor, sunt blocat peste tot, deoarece ultimul bloc le suprascrie pe celelalte:

      <Locație „/open/for/public1”>
          Solicitați toate acordate
      </Locație>
    
      <Locație „/open/for/public2”>
          Solicitați toate acordate
      </Locație>
    
      <Locație />
          Necesită ip 1.2.3.4
      </Locație
    
  • Am testat si eu folosind Director directive. În acest caz, ordinea nu contează (directivele sunt aplicate mai întâi în ordinea celei mai scurte potriviri)

      <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 >
    

    Pentru a alege între Director sau Locație directive, vezi recomandare apache.

  • Iată un alt exemplu testat folosind 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
drapel cz
Mulțumesc că m-ai îndreptat în direcția corectă! După zile (!) în care m-am lovit cu capul de perete, am decis să încerc cu regulile de rescriere și alertă LogLevel rewrite:trace6. Și se pare că, pe lângă unele fișiere .htaccess funky, există și câteva redirecționări interne în cod. Așa că am ajuns să folosesc ceva de genul: * RewriteCond %{REMOTE_ADDR} !1.2.3.4 RewriteCond %{REQUEST_URI} !^/open/for/public(.*) [NC] RewriteRule .* - [F,END]

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.