Как сделать условную защиту паролем .htaccess

Я пытаюсь защитить паролем конкретный URL-адрес с помощью .htaccess. Разные URL-адреса указывают на одни и те же файлы, но работают по-разному. Теперь мне нужно защитить паролем только один URL. Я пытаюсь сделать это с помощью setenvif, но, похоже, это не работает. Я не могу полностью понять цель или использование модуля apache setenv.

Это мой код, который, похоже, не работает

SetEnvIfNoCase Host "topasswordprotect\.domain\.com$" protecturl
<IfDefine protecturl>
  Require valid-user
  AuthName "Please enter your name and password"
  AuthType Basic
  AuthUserFile .htpasswd
</IfDefine>

person Clooner    schedule 09.03.2011    source источник
comment
Связанный вопрос: Условно требуется HTTP-аутентификация в зависимости от переменной env apache   -  person Simon East    schedule 23.09.2016


Ответы (3)


Я наконец-то понял. Мне действительно пришлось использовать движок mod_rewrite. Я был полон решимости найти решение, которое не требовало бы создания дополнительных файлов или каталогов.

Те же файлы, без дополнительных каталогов, один .htaccess:

# Case we are in the protected area!
RewriteCond %{REQUEST_FILENAME} index.php [OR]
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} ^(\/){1}$
RewriteCond %{REQUEST_FILENAME} !-d [OR]
RewriteCond %{REQUEST_URI} ^(\/){1}$
RewriteCond %{HTTP_HOST} ^(protected)\.mydomain\.com$
RewriteRule ^(.*)$ admin.php%{REQUEST_URI} [L]

#default rewrite
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

#only protect access to admin.php which is a symlink to index.php
<FilesMatch "admin.php">
  AuthUserFile .htpasswd
  AuthName EnterPassword
  AuthType Basic
  require valid-user
</FilesMatch>
person Clooner    schedule 11.03.2011
comment
Привет, у вас есть доступ к файлу здесь, но как вы можете защитить паролем блог, который физически не существует как ... com / blogname /, но перенаправлен с помощью htacess и постоянных ссылок? - person Paddy Callaghan; 21.04.2011
comment
Поскольку вы переписываете все / имя блога для использования file.php и secure file.php, вуаля, защита! это действительно хорошо работает! - person Clooner; 27.08.2013

Что ж, это действительно может быть достигнуто без mod_rewrite и с SetEnvIf. Мне он понадобился для сайта разработчиков, чтобы проверить, как работают теги Facebook OpenGraph.

# allow facebook external hit
SetEnvIf user-agent "facebookexternalhit/1.1" allowthis
# disallow some other stuff
SetEnvIfNoCase Host "topasswordprotect\.domain\.com$" !allowthis

AuthType Basic
AuthName "dev access"
AuthUserFile .htpasswd
Require valid-user

Allow from allowthis=1
Satisfy Any

IfDefine работает с определениями, которые не совпадают с переменными среды.

Цитата из документации apache:

Аргумент имени параметра - это определение, указанное в командной строке httpd через -Dparameter- во время запуска сервера.

person AndyDeGroo    schedule 28.02.2012

Возможно, это невозможно напрямую, но может ли у вас быть другой защищенный паролем каталог, который имеет исходный каталог, связанный с ним? Вы можете использовать mod_rewrite, чтобы перенаправить соответствующие запросы в каталог, защищенный паролем.

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.myhost.tld$
RewriteRule ^/foo/(.*)$ /bar/linkeddir/$1
person jkj    schedule 09.03.2011