Подтвердить что ты не робот

Пароль защищает определенный URL-адрес

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

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

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

Любое быстрое решение с .htaccess?

4b9b3361

Ответ 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

  1. Прежде всего, вам необходимо создать нового пользователя/пароль:

Эта команда:

htpasswd -c /etc/apache2/.htpasswd myuser1

Если вы используете Bitnami Apps (например, Open edx), вам нужно следовать этой инструкции:

htpasswd -c /opt/bitnami/apps/edx/conf/.htpasswd myuser1
  1. Затем, если вы определили виртуальный хост, вам нужно добавить следующие строки в ваш конфигурационный файл 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>
  1. В случае приложений 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>
  1. Наконец, вам нужно перезапустить сервер 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, чтобы код работал, но обычно он установлен заранее, поэтому вы должны быть в безопасности и в порядке, если вы не создаете собственную собственную сборку.