Jak korzystać ze ścieżki WZGLĘDNEJ z AuthUserFile w htaccess?

98

Mam .htaccess, który wykorzystuje uwierzytelnianie podstawowe. Wygląda na to, że ścieżka do pliku .htpasswd nie jest względna do pliku htaccess, ale zamiast tego do konfiguracji serwera.

Więc mimo że mam pliki .htaccess i .htpasswd w tym samym katalogu, to nie działa:

AuthType Basic
AuthName "Private Login"
AuthUserFile .htpasswd
Require valid-user

Jednak zadziała, jeśli zmienię AuthUserFile, aby użyć ścieżki bezwzględnej:

AuthType Basic
AuthName "Private Login"
AuthUserFile "/home/user/public_html/mydir/.htpasswd"
Require valid-user

Ale wolałbym coś bardziej mobilnego, ponieważ używam tego w wielu witrynach w różnych obszarach. Przeszukałem sieć, ale nie znalazłem żadnego rozwiązania. Czy można użyć ścieżki względnej lub takich zmiennych %{DOCUMENT_ROOT}?

DssTrainer
źródło

Odpowiedzi:

51

Nie można używać ścieżek względnych dla AuthUserFile :

Ścieżka do pliku to ścieżka do pliku użytkownika. Jeśli nie jest bezwzględny (tj. Jeśli nie zaczyna się od ukośnika), jest traktowany jako względny w stosunku do ServerRoot.

Musisz zaakceptować i obejść to ograniczenie.


Używamy IfDefinerazem z parametrem wiersza poleceń apache2 :

.htaccess (nadaje się zarówno do systemów deweloperskich, jak i na żywo):

<IfDefine !development>
  AuthType Basic
  AuthName "Say the secret word"
  AuthUserFile /var/www/hostname/.htpasswd
  Require valid-user
</IfDefine>

Konfiguracja serwera deweloperskiego (Debian)

Dołącz poniższe do /etc/apache2/envvars:

export APACHE_ARGUMENTS=-Ddevelopment

Zrestartuj swój apache później, a pojawi się monit o hasło tylko wtedy, gdy nie jesteś na serwerze deweloperskim.

Możesz oczywiście dodać kolejny IfDefine dla serwera deweloperskiego, po prostu skopiuj blok i usuń !.

cweiske
źródło
4
Ale nadal używa się ścieżki absolutnej ( /var/...) - a pytanie brzmi: „jak używać ścieżki względnej”?
sdaau
1
A potem pytanie zostało zredagowane, aby poprawnie odpowiedzieć „nie” :)
Erenor Paz
15

Na wszelki wypadek ludzie szukają rozwiązania tego:

<If "req('Host') = 'www.example.com'">
    Authtype Basic
    AuthName "user and password"
    AuthUserFile /var/www/www.example.com/.htpasswd
    Require valid-user
</If>
maska ​​8
źródło
1
Byłoby świetnie, ale czy można bezpiecznie polegać req('Host'), czy klient nie może oszukać tej wartości?
Marco Demaio
1
@MarcoDemaio Tak, można / można oszukać, używając na przykład adresu IP. To zależy od twojej konfiguracji. To nie jest absolutne tak lub nie. To zależy.
Maxime
12

1) Zauważ, że umieszczanie .htpasswdpliku poniżej katalogu głównego serwera jest uważane za niebezpieczne .

2) docs powiedzieć o względnych ścieżek, tak to wygląda masz pecha:

Ścieżka do pliku to ścieżka do pliku użytkownika. Jeśli nie jest bezwzględny (tj. Jeśli nie zaczyna się od ukośnika), jest traktowany jako względny w stosunku do ServerRoot .

3) Chociaż odpowiedzi zalecające użycie zmiennych środowiskowych działają doskonale, wolałbym umieścić symbol zastępczy w .htaccesspliku lub mieć różne wersje w mojej bazie kodu i pozwolić procesowi wdrażania skonfigurować to wszystko (tj. Zastąpić symbole zastępcze lub zmienić nazwę / przenieś odpowiedni plik).

W projektach Java używam Mavena do wykonywania tego typu pracy, na przykład w projektach PHP, lubię mieć skrypt powłoki build.sh i / lub install.sh, który dostosowuje wdrożone pliki do ich środowiska. To oddziela twój kod źródłowy od specyfiki środowiska docelowego (tj. Jego zmiennych środowiskowych i parametrów konfiguracyjnych). Ogólnie rzecz biorąc, aplikacja powinna dostosowywać się do środowiska, jeśli zrobisz to na odwrót, możesz napotkać problemy, gdy środowisko będzie również musiało obsługiwać różne aplikacje lub całkowicie niepowiązane wymagania specyficzne dla systemu.

Hanno Fietz
źródło
8

możesz umieścić swoje ustawienia uwierzytelniania w środowisku. Lubić:

SetEnvIf HTTP_HOST testsite.local APPLICATION_ENV=development
<IfDefine !APPLICATION_ENV>
  Allow from all
  AuthType Basic
  AuthName "My Testseite - Login" 
  AuthUserFile /Users/tho/htdocs/wgh_staging/.htpasswd
  Require user username
</IfDefine>

Autoryzacja działa, ale nie mogłem tak naprawdę uruchomić mojego środowiska.

digitaldonkey
źródło
1
Myślę, że problem jest następujący: „Tylko te zmienne środowiskowe zdefiniowane we wcześniejszych dyrektywach SetEnvIf [NoCase] ​​są dostępne do testowania w ten sposób.„ Wcześniej ”oznacza, że ​​zostały zdefiniowane w szerszym zakresie (na przykład na poziomie serwera) lub wcześniej zakres obecnej dyrektywy. ” (można znaleźć tutaj: askapache.com/htaccess/setenvif.html ) Ponieważ masz ten sam zakres, nie możesz uruchomić swojego środowiska.
user470370
4
dlaczego to nie działa, jest wyjątkowo dobrze wyjaśnione tutaj stackoverflow.com/questions/11073752/ ...
nico gawenda
Ale nadal używa się ścieżki absolutnej ( /Users/...) - a pytanie brzmi: „jak używać ścieżki względnej”?
sdaau
Tak. Możesz jednak użyć wielu ustawień APPLICATION_ENV, aby użyć wielu ścieżek bezwzględnych na środowisko.
digitaldonkey
5

.htpasswd wymaga pełnej ścieżki bezwzględnej od bezwzględnego katalogu głównego serwera.

Uzyskaj pełną bezwzględną ścieżkę do pliku przez echo echo $_SERVER['DOCUMENT_ROOT'];.

tutaj działa podstawowy skrypt auth .htaccess.

AuthType Basic
AuthName "Access to the Hidden Files"
AuthUserFile 'C:/xampp/htdocs/ht/.htpasswd'
Require valid-user

Przed zalogowaniem

wprowadź opis obrazu tutaj

Po zalogowaniu

wprowadź opis obrazu tutaj

muni
źródło
3

Jeśli próbujesz używać XAMPP w systemie Windows i chcesz użyć pliku .htaccess na serwerze rzeczywistym, a także rozwijać się na maszynie programistycznej XAMPP, poniższe działa świetnie!


1) Po nowej instalacji XAMPP upewnij się, że Apache jest zainstalowany jako usługa.

  • Odbywa się to poprzez otwarcie Panelu sterowania XAMPP i kliknięcie małego czerwonego „X” po lewej stronie modułu Apache.
  • Następnie zapyta Cię, czy chcesz zainstalować Apache jako usługę.
  • Następnie powinien zmienić się w zielony znacznik wyboru.

2) Gdy Apache jest instalowany jako usługa, dodaj nową zmienną środowiskową jako flagę.

  • Najpierw zatrzymaj usługę Apache z Panelu sterowania XAMPP.
  • Następnie otwórz wiersz polecenia. (Znasz małe czarne okienko symulujące DOS)
  • Wpisz „C: \ Program Files (x86) \ xampp \ apache \ bin \ httpd.exe” -D „DEV” -k config .
  • Spowoduje to dodanie nowej flagi DEV do zmiennych środowiskowych, których możesz użyć później.

3) Uruchom Apache

  • Otwórz kopię zapasową Panelu sterowania XAMPP i uruchom usługę Apache.

4) Utwórz plik .htaccess z następującymi informacjami ...

<IfDefine DEV>
  AuthType Basic
  AuthName "Authorized access only!"
  AuthUserFile "/sandbox/web/scripts/.htpasswd"
  require valid-user
</IfDefine>

<IfDefine !DEV>
  AuthType Basic
  AuthName "Authorized access only!"
  AuthUserFile "/home/arvo/public_html/scripts/.htpasswd"
  require valid-user
</IfDefine>

Aby wyjaśnić powyższy skrypt, oto kilka uwag ...

  • Mój plik AuthUserFile jest oparty na mojej konfiguracji i osobistych preferencjach.
  • Mam lokalny program testowy, na którym moja strona internetowa znajduje się w c: \ sandbox \ web \ . Wewnątrz tego folderu mam folder o nazwie scripts, który zawiera plik haseł .htpasswd .
  • Dla tej instancji używany jest pierwszy wpis IfDefine DEV . Jeśli DEV jest ustawione (co zrobiliśmy powyżej, tylko na maszynie deweloperskiej coarse), użyje tego wpisu.
  • A z kolei w przypadku korzystania z serwera live zostanie użyty IfDefine! DEV .

5) Utwórz plik z hasłami (w tym przypadku o nazwie .htpasswd) zawierający następujące informacje ...

użytkownik: $ apr1 $ EPuSBcwO $ / KtqDUttQMNUa5lGXSOzk.

Kilka uwag ...

Arvo Bowen
źródło
Ale nadal używa się ścieżki absolutnej ( /home...) - a pytanie brzmi: „jak używać ścieżki względnej”?
sdaau
2

lub jeśli tworzysz na localhost (tylko dla Apache 2.4+):

<If "%{REMOTE_ADDR} != '127.0.0.1'">
</If>
amxm
źródło
1

Wiem, że to stare pytanie, ale właśnie szukałem tego samego i prawdopodobnie wielu innych szuka szybkiego, mobilnego rozwiązania. Oto, co w końcu wymyśliłem:

# We set production environment by default
SetEnv PROD_ENV 1

<IfDefine DEV_ENV>
  # If 'DEV_ENV' has been defined, then unset the PROD_ENV
  UnsetEnv PROD_ENV

  AuthType Basic
  AuthName "Protected Area"
  AuthUserFile /var/www/foo.local/.htpasswd
  Require valid-user
</IfDefine>

<IfDefine PROD_ENV>
  AuthType Basic
  AuthName "Protected Area"
  AuthUserFile /home/foo/public_html/.htpasswd
  Require valid-user
</IfDefine>
ovi
źródło
Ale nadal używa się ścieżki absolutnej ( /var...) - a pytanie brzmi: „jak używać ścieżki względnej”?
sdaau
1
Tak, jest to obejście, ponieważ Apache nie obsługuje ścieżek względnych do lokalizacji .htaccesspliku. Jeśli użyjesz ścieżki względnej, zostanie ona uznana za względną w stosunku do ServerRoot.
ovi
1

Weźmy przykład.

Twoja aplikacja znajduje się w / var / www / myApp na jakimś serwerze Linux

.htaccess : /var/www/myApp/.htaccess

htpasswdApp : / var / www / myApp / htpasswdApp . (Możesz używać dowolnej nazwy dla .htpasswd pliku )

Aby użyć ścieżki względnej w .htaccess :

AuthType Digest
AuthName myApp
AuthUserFile "htpasswdApp"
Require valid-user

Ale będzie szukać pliku w katalogu server_root . Nie w document_root .

W przypadku, gdy aplikacja znajduje się pod adresem / var / www / myApp :

katalog_główny_dokumentu to / var / www / myApp

server_root to / etc / apache2 // (tylko w naszym przykładzie, ponieważ używamy serwera linux )

Możesz go przedefiniować w swoim pliku konfiguracyjnym Apache ( /etc/apache2/apache2.conf ), ale myślę, że to zły pomysł.

Aby więc użyć względnej ścieżki pliku w swoim /var/www/myApp/.htaccess , należy zdefiniować plik hasła w swoim server_root .

Wolę to zrobić, wykonując polecenie:

sudo ln -s /var/www/myApp/htpasswdApp /etc/apache2/htpasswdApp

Możesz skopiować moje polecenie, użyć twardego łącza zamiast symbolu lub skopiować plik do swojego server_root .

Sild
źródło
1
ponieważ apache domyślnie blokuje dostęp do plików zaczynających się od .ht *, nie zaleca się używania dla nich losowych nazw.
cari