Uwierzytelnianie Apache: zezwól na publiczny dostęp do podkatalogu

13

Jest to prawdopodobnie prosty problem, ale nie mogę znaleźć rozwiązania w dokumentacji.

Chcę zabezpieczyć hasłem moją witrynę za pomocą uwierzytelniania BASIC. Ale chcę, aby podkatalog nie był chroniony:

http://mysite.com/ -> BASIC protected
http://mysite.com/somedir -> BASIC protected
http://mysite.com/someotherdir -> BASIC protected
http://mysite.com/public -> not protected

Nie mam problemu z ochroną całej witryny, ale nie wiem, jak mogę „zabezpieczyć” jeden katalog. Witryna jest hostowana na hoście współdzielonym, więc mam tylko dostęp do plików .htaccess w celu wykonania konfiguracji.

Czy istnieje dyrektywa negująca uwierzytelnianie?

Dzięki za pomoc ...

Guillaume
źródło
To wydaje się być najbardziej poprawne rozwiązanie: stackoverflow.com/questions/2641646/…
BryanK

Odpowiedzi:

10

Nie powinno być problemu z .htaccess, w zależności od tego, na co zezwolił host.

Możesz spróbować umieścić plik .htaccess w podfolderze w następujący sposób, chociaż trzeba będzie włączyć przesłonięcia dla katalogów, w których się znajduje.

 Allow From All
 Satisfy Any
Cylindryczny
źródło
1
Tajny sos tutaj, IIRC, polega na umieszczeniu pliku .htaccess w katalogu głównym witryny, ale wpis w tym pliku .htaccess, taki jak ten, o którym mówi Cylindric.
Paul Lathrop
I nie zapomnij dodać (lub upewnić się, że istnieje) AllowOverride, aby użyć .htaccess.
TCampbell
1
@Paul - usunąłem swoją odpowiedź, ale odpowiedź AFAICR Cylindric jest obecnie nieprawidłowa? Plik .htaccess w podkatalogu nie może zastąpić jednego wyżej. Jednak plik .htaccess w katalogu nadrzędnym może również zawierać elementy sterujące (lub nawet je usunąć) dla podkatalogów.
Alnitak
Próbowałem zarówno umieścić dyrektywę <Directory /> w folderze głównym, jak i w folderze, który chcę być publiczny, ale w obu przypadkach otrzymuję HTTP 500. Jakieś inne pomysły?
Guillaume
1
Nie możesz używać <Directory> w .htaccess, chociaż możesz używać <Files> i <Lokalizacja>
Alnitak
7

OK, dla ścieżki server.com/private/public:

server.com/private/.htaccess

AuthType Basic
AuthName "Private, keep out."
Require...

server.com/private/public/.htaccess

Allow From All
Satisfy Any

Kluczem jest tutaj „Satisfy Any”, który RNO razem wymagania od góry. „Satisfy All” jest ustawieniem domyślnym.

CK
źródło
Dziękujemy za wyjaśnienie „Satisfy Any”
Mario
1

Wierzę, że to może to zrobić:

# put the global auth stuff here
...

# put the override here
<Location /public>
Allow from All
Satisfy Any
</Location>
Alnitak
źródło
Używanie <Lokalizacji> do kontroli dostępu nigdy nie jest dobrym pomysłem. Kontroluje dostęp tylko poprzez nazwę, a nie sam zasób. Zatem wszystko, co zapewnia dostęp do niego pod inną nazwą (na przykład Alias), nie ma nad nim kontroli dostępu.
CK.
1
@CK Właściwie musisz użyć Lokalizacji, jeśli lokalizacja, o której mowa, nie jest katalogiem fizycznym, lecz jedynie katalogiem „wirtualnym” w przebraniu mod_rewrite.
Natalie Adams,
0

Udało mi się to rozwiązać w ten sposób:

<Directory "/path/to/maindirectory">
[... auth stuff ... ]
</Directory>

<Directory "/path/to/mysubdirectory">
 Allow from All
 Satisfy Any
</Directory>

NIE używaj Lokalizacji, ponieważ są rozróżniane małe i wielkie litery i nie działają na faktyczny dostęp do folderów, ale tylko na adres URL.

Na przykład, jeśli napiszę

http:/mywebsite/STUFF

lub

http://mywebsite/stuff

lub

http://mywebsite/StUfF

różni się w przypadku kontroli lokalizacji, nawet jeśli wywoływany katalog fizyczny jest taki sam !!!

W skrócie, sprawdzasz dostęp do katalogu „rzeczy”, a ja mogę go napisać w innym przypadku.

Również używanie pliku .htaccess w jednym katalogu z kontrolą lokalizacji w innych nie działało.

Mam nadzieję, że to pomoże.

xela92
źródło