Ochrona hasłem określonego adresu URL

Strona jest na współdzielonym hostingu. Muszę zabezpieczyć hasłem jeden adres URL.

http://www.example.com/pretty/url

Oczywiście nie jest to fizyczna ścieżka do pliku, którą próbuję chronić, tylko ten konkretny adres URL.

Dowolne szybkie rozwiązanie z .htaccess?

Author: Jan Hančič, 2013-01-30

7 answers

Powinieneś być w stanie to zrobić używając kombinacji mod_env i dyrektywy Satisfy any. Możesz użyć SetEnvIf, aby sprawdzić w stosunku do Request_URI, nawet jeśli nie jest to ścieżka fizyczna. Następnie można sprawdzić, czy zmienna jest ustawiona w instrukcji Allow. Więc albo musisz się zalogować za pomocą hasła, albo Allow pozwala Ci wejść bez hasła:

# Do the regex check against the URI here, if match, set the "require_auth" var
SetEnvIf Request_URI ^/pretty/url require_auth=true

# Auth stuff
AuthUserFile /var/www/htpasswd
AuthName "Password Protected"
AuthType Basic

# Setup a deny/allow
Order Deny,Allow
# Deny from everyone
Deny from all
# except if either of these are satisfied
Satisfy any
# 1. a valid authenticated user
Require valid-user
# or 2. the "require_auth" var is NOT set
Allow from env=!require_auth
 55
Author: Jon Lin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-30 13:20:56

Możesz użyć <LocationMatch> lub po prostu <Location> wewnątrz twojej dyrektywy <VirtualHost> (zakładając, że masz dostęp do swojego httpd.conf / vhost.conf-ewentualnie można umieścić coś podobnego whtaccess w katalogu głównym dokumentu, jeśli musisz skonfigurować witrynę w ten sposób).

Na przykład:

<VirtualHost *:80>
  ServerName www.example.com
  DocumentRoot /var/www/blabla
  # Other usual vhost configuration here
  <Location /pretty/url>
    AuthUserFile /path/to/.htpasswd
    AuthGroupFile /dev/null
    AuthName "Password Protected"
    AuthType Basic
    require valid-user
  </Location>
</VirtualHost>

Możesz znaleźć <LocationMatch> bardziej przydatne, jeśli chcesz dopasować Wyrażenie regularne do twojego pięknego adresu URL. Dokumentacja jest tutaj .

 14
Author: Coder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-17 19:22:54

Wszystkie dostarczone rozwiązania nie działały dla mnie. Domyśliłem się, że następujące dyrektywy załatwiają sprawę:

SetEnvIf Request_URI ^/page-url auth=1

AuthName "Please login"
AuthType Basic
AuthUserFile "/www/live.example.com/files/html/.htpasswd"

# first, allow everybody
Order Allow,Deny
Satisfy any
Allow from all
Require valid-user
# then, deny only if required
Deny from env=auth
 4
Author: Stefan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-10 12:41:20

Ponieważ Rick stwierdził w komentarzu, że żadna odpowiedź na to pytanie nie działa, oto fragment, którego używam:

AuthName "Protected Area"
AuthType Basic
AuthUserFile /path/to/your/.htpasswd
AuthGroupFile /dev/null

SetEnvIf Request_URI .* noauth
SetEnvIf Request_URI the_uri_you_want_to_protect !noauth
SetEnvIf Request_URI another_uri !noauth
SetEnvIf Request_URI add_as_many_as_you_want !noauth

<RequireAny>
  Require env noauth
  Require valid-user
</RequireAny>

Jeśli potrzebujesz wsparcia dla Apache 2.2 i Apache 2.4 (najwyraźniej istnieją konfiguracje, w których obie wersje działają równolegle...):

AuthName "Protected Area"
AuthType Basic
AuthUserFile /path/to/your/.htpasswd
AuthGroupFile /dev/null

SetEnvIf Request_URI .* noauth
SetEnvIf Request_URI the_uri_you_want_to_protect !noauth
SetEnvIf Request_URI another_uri !noauth
SetEnvIf Request_URI add_as_many_as_you_want !noauth

<IfModule mod_authz_core.c>
    <RequireAny>
        Require env noauth
        Require valid-user
    </RequireAny>
</IfModule>

<IfModule !mod_authz_core.c>
    Order Deny,Allow
    Deny from all
    Satisfy any
    Require valid-user
    Allow from env=noauth
</IfModule>

Kod Apache 2.2 pochodzi z Jon Lin .

 4
Author: Pharaoh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-02 13:13:13

Niestety nie mogę skomentować odpowiedzi @jon-lin. Więc tworzę nową odpowiedź. Moje zaadaptowane rozwiązanie w środowisku apache 2.4 to:

#
# password protect /pretty/url URIs
#

AuthType Basic
AuthName 'Authentication required'
AuthUserFile /path/to/.htpasswd

# Restrict access to some urls
SetEnvIf Request_URI ^/pretty/url  auth=1

<RequireAll>
  # require the auth variable to be set
  Require env auth
  # require an valid-user
  Require valid-user
</RequireAll>
 0
Author: simne7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-06 18:28:42

A co z przekierowaniem użytkownika do podfolderu chronionego hasłem?

.htaccess

RewriteCond %{HTTP_COOKIE} !BadHorsie=secret_cookie_key
RewriteRule ^(pretty/url)$ /protected/login.php?url=$1 [R=307,L]

Protected/.htaccess

AuthUserFile /usr/www/{YOUR_PATH}/protected/.htpasswd
AuthGroupFile /dev/null
AuthName "Protected"
AuthType Basic
require user BadHorsie

Protected/.htpasswd

BadHorsie:$apr1$fFbaaVdF$Q5ql58g7R4qlpMUDb/5A0/

Protected / login.php

<?php
if (isset($_GET['url']) && $_GET['url'] && $_GET['url'][0] != '/' && strpos($_GET['url'], '//') === false) {
    setcookie('BadHorsie', 'secret_cookie_key', 0, '/');
    header('Location: /' . $_GET['url'], true, 307);
    exit;
}
?>

Co się dzieje

  1. żądania użytkowników example.com/pretty/url
  2. 307 przekierowanie do example.com/protected/login.php?url=pretty/url
  3. login
  4. na sukces: użytkownik uzyskuje plik cookie sesji z tajnym kluczem
  5. 307 redirect back to example.com/pretty/url
  6. Użytkownik uzyskuje tajemnicę content

Uwaga: oczywiście mechanizm "session cookie and back-redirecting" jest w pełni opcjonalny. W końcu możesz serwować swoje tajne treści bezpośrednio przez protected/login.php. Pokazałem tę drogę tylko dla inspiracji.

Opcjonalnie: nie Używaj PHP i Ustaw plik cookie .htaccess.

 0
Author: mgutt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-23 23:50:00

Powyższe rozwiązanie jest zbyt zajęte i trochę popaprane.. Stawiam na prostotę i klarowność w ten sposób

<Files "protected.html">
 AuthName "Username and password required"
 AuthUserFile /home/fullpath/.htpasswd
 Require valid-user
 AuthType Basic
</Files>

Powyższe należy umieścić w pliku htaccess, gdzie " protected.html " to plik, który chcesz chronić (może to być cokolwiek chcesz, na przykład myphoto.jpg lub dokument.zip, po prostu zmień nazwę według swoich preferencji). Plik AuthUserFile jest pełną ścieżką do pliku hasła. Jesteś skończony.

Chociaż być może będziesz musiał upewnić się, że Warunki wstępne są ustawione. AllowOverride i AuthConfig są wymagane w konfiguracjach tagów katalogu Apache, aby Kod działał, ale zwykle jest on wstępnie ustawiony po wyjęciu z pudełka, więc powinieneś być bezpieczny i w porządku, chyba że tworzysz własną, niestandardową kompilację.

 -1
Author: Dennis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-24 14:40:05