Защита паролем определенного URL
сайт находится на виртуальном хостинге. Мне нужно защитить паролем один URL.
http://www.example.com/pretty/url
очевидно, что это не физический путь к файлу, который я пытаюсь защитить, это просто конкретный URL.
любое быстрое решение с.реврайт?
7 ответов
можно использовать <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;
}
?>
что происходит
- запросы пользователей
example.com/pretty/url
- 307 редирект на
example.com/protected/login.php?url=pretty/url
- логин
- об успехе: пользователь получает cookie сеанса с секретом ключ
- 307 перенаправить обратно в
example.com/pretty/url
- пользователь получает секретный контент
Примечание: конечно,"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 для работы кода, но обычно он предварительно задан из коробки, поэтому вы должны быть в безопасности и в порядке, если вы не делаете свою собственную сборку.