Защита паролем определенного URL

сайт находится на виртуальном хостинге. Мне нужно защитить паролем один URL.

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

очевидно, что это не физический путь к файлу, который я пытаюсь защитить, это просто конкретный URL.

любое быстрое решение с.реврайт?

7 ответов


вы должны быть в состоянии сделать это, используя комбинацию mod_env и


можно использовать <LocationMatch> или просто <Location> внутри <VirtualHost> директива для этого (при условии, что у вас есть доступ к вашему httpd.конф / файл vhost.conf-в качестве альтернативы вы можете поместить что-то подобное в a .htaccess в корне документа, если вам нужно настроить свой сайт таким образом).

например:

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

вы можете найти <LocationMatch> более полезно, если вы хотите сопоставить регулярное выражение с вашим красивым URL-адресом. Документация здесь.


все предоставленные решения не работали для меня. Я понял, что следующие директивы делают трюк:

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

поскольку Рик заявил в комментарии, что ответ на этот вопрос не работает, вот фрагмент, который я использую:

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>

Если вам нужна поддержка Apache 2.2 и Apache 2.4 (по-видимому, есть настройки, где обе версии работают параллельно...):

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>

код для Apache 2.2 взят из Джон Лин.


к сожалению, я не могу прокомментировать ответ @jon-lin. Итак, я создаю новый ответ. Мое адаптированное решение в среде apache 2.4:

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

насчет перенаправления пользователя на защищенную паролем папку?

.реврайт

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

защищены/.реврайт

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

защищены/.помощью пароля через htpasswd

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

защищенный/логин.в 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;
}
?>

что происходит

  1. запросы пользователей example.com/pretty/url
  2. 307 редирект на example.com/protected/login.php?url=pretty/url
  3. логин
  4. об успехе: пользователь получает cookie сеанса с секретом ключ
  5. 307 перенаправить обратно в example.com/pretty/url
  6. пользователь получает секретный контент

Примечание: конечно,"cookie сеанса и back-redirecting" -механизм полностью необязателен. Наконец, вы можете обслуживать свой секретный контент непосредственно через protected/login.php. Я показал этот путь только для вдохновения.

необязательно: не используйте PHP и установите cookie через .реврайт.


решение выше слишком занято и немного испорчено.. Я иду на простоту и ясность, как это

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

вышеуказанное должно быть помещено в ваш файл htaccess, где "защищено.html " - это файл, который вы хотите защитить (это может быть все, что вы хотите, например, myphoto.jpg или документ.zip, просто переименуйте его по своему усмотрению). AuthUserFile-это полный путь к вашему файлу паролей. Вы закончили.

хотя вам, возможно, придется убедиться, что предварительные условия для этого настроены. AllowOverride и AuthConfig требуются в конфигурациях тегов каталога Apache для работы кода, но обычно он предварительно задан из коробки, поэтому вы должны быть в безопасности и в порядке, если вы не делаете свою собственную сборку.