Пароль защищает определенный URL-адрес
Сайт находится на общедоступном хостинге. Мне нужно защитить паролем один URL-адрес.
http://www.example.com/pretty/url
Очевидно, что не физический путь к файлу, который я пытаюсь защитить, это только тот конкретный URL.
Любое быстрое решение с .htaccess?
Ответы
Ответ 1
Вы должны сделать это, используя комбинацию mod_env и директивы Satisfy any
. Вы можете использовать SetEnvIf
для проверки на Request_URI
, даже если это не физический путь. Затем вы можете проверить, установлена ли переменная в инструкции Allow
. Поэтому либо вам нужно войти в систему с паролем, либо Allow
позволяет вам без пароля:
# 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
Ответ 2
Вы можете использовать <LocationMatch>
или просто <Location>
внутри вашей директивы <VirtualHost>
, чтобы сделать это (при условии, что у вас есть доступ к вашему httpd.conf/vhost.conf), иначе вы можете поместить что-то подобное в .htaccess в своем root, если вам нужно настроить свой сайт таким образом).
Например:
<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-адресом. Документация здесь.
Ответ 3
Поскольку Рик заявил в комментарии, что никакой ответ в этом вопросе не работает, вот фрагмент, который я использую:
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.
Ответ 4
Все предоставленные решения не работают для меня. Я полагал, что следующие директивы добиваются цели:
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
Ответ 5
Я обновил код Jon Lin с целью защиты всех URL-адресов, кроме одного, например robots.txt в корне vhost. Это директивы, соответствующие Apache 2.2.
<ifmodule mod_setenvif.c>
SetEnv require_no_auth=false
SetEnvIf Request_URI "^/robots.txt" require_no_auth=true
AuthType Basic
AuthName "Restricted"
AuthUserFile /home/someuser/.htpasswd
# Setup a deny/allow
Order Deny,Allow
# Deny from everyone
Deny from all
# 1. a valid authenticated user
Require valid-user
# or 2. the "require_no_auth" var is set
Allow from env=require_no_auth
# except if either of these are satisfied
Satisfy any
</ifmodule>
Тот же код для Apache 2.4
<ifmodule mod_setenvif.c>
SetEnv require_no_auth=false
SetEnvIf Request_URI "^/robots.txt" require_no_auth=true
AuthType Basic
AuthBasicProvider file
AuthName "Restricted"
AuthUserFile /home/someuser/.htpasswd
# grant access if either of these are satisfied
# 1. a valid authenticated user
Require valid-user
# or 2. the "require_no_auth" var is set
Require env require_no_auth
</ifmodule>
Ответ 6
Как перенаправить пользователя в подпапку, защищенную паролем?
.htaccess
RewriteCond %{HTTP_COOKIE} !BadHorsie=secret_cookie_key
RewriteRule ^(pretty/url)$ /protected/login.php?url=$1 [R=307,L]
защищены/.htaccess
AuthUserFile /usr/www/{YOUR_PATH}/protected/.htpasswd
AuthGroupFile /dev/null
AuthName "Protected"
AuthType Basic
require user BadHorsie
защищены/.htpasswd
BadHorsie:$apr1$fFbaaVdF$Q5ql58g7R4qlpMUDb/5A0/
защищены/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;
}
?>
Что происходит
- Пользовательские запросы
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 через .htaccess.
Ответ 7
- Прежде всего, вам необходимо создать нового пользователя/пароль:
Эта команда:
htpasswd -c /etc/apache2/.htpasswd myuser1
Если вы используете Bitnami Apps (например, Open edx), вам нужно следовать этой инструкции:
htpasswd -c /opt/bitnami/apps/edx/conf/.htpasswd myuser1
- Затем, если вы определили виртуальный хост, вам нужно добавить следующие строки в ваш конфигурационный файл apache.
Этот конфиг:
<VirtualHost *:80>
...
<Location />
Deny from all
#Allow from (Set IP to allow access without password)
AuthUserFile /etc/apache2/.htpasswd
AuthName "Restricted Area"
AuthType Basic
Satisfy Any
require valid-user
</Location>
...
</VirtualHost>
- В случае приложений Bitnami вам необходимо добавить эти конфиги в /opt/bitnami/apps/edx/conf/httpd-lms.conf:
Этот конфиг для защиты всех URL.
<Location />
Deny from all
#Allow from (Set IP to allow access without password)
AuthUserFile /opt/bitnami/apps/edx/conf/.htpasswd
AuthName "Restricted Area"
AuthType Basic
Satisfy Any
require valid-user
</Location>
- Наконец, вам нужно перезапустить сервер Apache.
В приложениях Bitnami:
/opt/bitnami/ctlscript.sh restart apache
Ответ 8
К сожалению, я не могу комментировать ответ @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>
Ответ 9
вышеприведенное решение слишком занято и немного испортилось.. Я хожу для простоты и ясности, как это
<Files "protected.html">
AuthName "Username and password required"
AuthUserFile /home/fullpath/.htpasswd
Require valid-user
AuthType Basic
</Files>
Вышеупомянутое должно быть помещено в ваш файл htaccess, где "protected.html" - это файл, который вы хотите защитить (это может быть все, что вы пожелаете, например myphoto.jpg или document.zip, просто переименовать это по вашему усмотрению). AuthUserFile - это полный путь к вашему файлу паролей. Вы сделали.
Хотя вам, возможно, придется убедиться, что для этого установлены условия. AllowOverride и AuthConfig требуются в конфигурациях тегов каталога Apache, чтобы код работал, но обычно он установлен заранее, поэтому вы должны быть в безопасности и в порядке, если вы не создаете собственную собственную сборку.