Как использовать ОТНОСИТЕЛЬНЫЙ путь с AuthUserFile в htaccess?

98

У меня есть .htaccess, использующий базовую аутентификацию. Кажется, что путь к файлу .htpasswd не относится к файлу htaccess, а к конфигурации сервера.

Поэтому, хотя у меня есть файлы .htaccess и .htpasswd в одном каталоге, это не работает:

AuthType Basic
AuthName "Private Login"
AuthUserFile .htpasswd
Require valid-user

Однако это сработает, если я изменю AuthUserFile на использование абсолютного пути:

AuthType Basic
AuthName "Private Login"
AuthUserFile "/home/user/public_html/mydir/.htpasswd"
Require valid-user

Но я бы предпочел что-то более мобильное, поскольку использую это на нескольких сайтах в разных областях. Я искал в Интернете, но не нашел решения. Можно ли использовать относительный путь или такие переменные, как %{DOCUMENT_ROOT}?

DssTrainer
источник

Ответы:

51

Для AuthUserFile нельзя использовать относительные пути :

File-path - это путь к пользовательскому файлу. Если он не абсолютный (т. Е. Не начинается с косой черты), он рассматривается как относительный к ServerRoot.

Вы должны принять это ограничение и обойти его.


Мы используем IfDefineвместе с параметром командной строки apache2 :

.htaccess (подходит как для разработки, так и для живых систем):

<IfDefine !development>
  AuthType Basic
  AuthName "Say the secret word"
  AuthUserFile /var/www/hostname/.htpasswd
  Require valid-user
</IfDefine>

Конфигурация сервера разработки (Debian)

Добавьте следующее в /etc/apache2/envvars:

export APACHE_ARGUMENTS=-Ddevelopment

После этого перезапустите свой apache, и вы получите запрос пароля только тогда, когда вы не на сервере разработки.

Вы, конечно, можете добавить еще один IfDefine для сервера разработки, просто скопируйте блок и удалите !.

Cweiske
источник
4
Но при этом по-прежнему используется абсолютный путь ( /var/...) - и возникает вопрос: «как использовать относительный путь»?
sdaau
1
А затем вопрос был отредактирован, чтобы правильно ответить «нет» :)
Эренор Паз
15

На всякий случай люди ищут решение для этого:

<If "req('Host') = 'www.example.com'">
    Authtype Basic
    AuthName "user and password"
    AuthUserFile /var/www/www.example.com/.htpasswd
    Require valid-user
</If>
маска8
источник
1
Это было бы здорово, но безопасно ли на это полагаться req('Host'), не может ли клиент обмануть это значение?
Марко Демайо
1
@MarcoDemaio Да, его можно / можно обмануть, используя, например, IP-адрес. Это зависит от вашей конфигурации. Это не абсолютное да или нет. Это зависит.
Максим
12

1) Обратите внимание, что наличие .htpasswdфайла ниже корня сервера считается небезопасным .

2) В документах говорится об относительных путях, поэтому похоже, что вам не повезло:

File-path - это путь к пользовательскому файлу. Если он не является абсолютным (т . Е. Не начинается с косой черты), он рассматривается как относительный к ServerRoot .

3) Хотя ответы, рекомендующие использовать переменные среды, работают отлично, я бы предпочел поместить заполнитель в .htaccessфайл или иметь разные версии в моей кодовой базе и настроить все это в процессе развертывания (т.е. заменить заполнители или переименовать / переместите соответствующий файл).

В проектах Java я использую Maven для выполнения этого типа работы, например, в проектах PHP, мне нравится иметь сценарий оболочки build.sh и / или install.sh, который настраивает развернутые файлы в соответствии с их средой. Это отделяет вашу кодовую базу от специфики ее целевой среды (то есть ее переменных среды и параметров конфигурации). В общем, приложение должно адаптироваться к среде, если вы сделаете это наоборот, вы можете столкнуться с проблемами, когда среда также должна обслуживать различные приложения или для совершенно несвязанных, специфичных для системы требований.

Ханно Фиц
источник
8

вы можете поместить свои настройки Auth в Environment. Подобно:

SetEnvIf HTTP_HOST testsite.local APPLICATION_ENV=development
<IfDefine !APPLICATION_ENV>
  Allow from all
  AuthType Basic
  AuthName "My Testseite - Login" 
  AuthUserFile /Users/tho/htdocs/wgh_staging/.htpasswd
  Require user username
</IfDefine>

Auth работает, но моя среда не работает.

цифровой ослик
источник
1
Я думаю, проблема в следующем: «Только те переменные среды, которые были определены ранее в директивах SetEnvIf [NoCase], доступны для тестирования таким образом.« Ранее »означает, что они были определены в более широком контексте (например, на уровне сервера) или ранее в область действия текущей директивы ". (находится здесь: askapache.com/htaccess/setenvif.html ) Из-за того, что у вас такая же область видимости, вы не могли запустить свою среду.
user470370
4
почему это не работает, исключительно хорошо объясняется здесь stackoverflow.com/questions/11073752/…
nico gawenda
Но при этом по-прежнему используется абсолютный путь ( /Users/...) - и возникает вопрос: «как использовать относительный путь»?
sdaau
Да. Но вы можете использовать несколько настроек APPLICATION_ENV, чтобы использовать несколько абсолютных путей для каждой среды.
digitaldonkey
5

.htpasswd требует полного абсолютного пути от абсолютного корня сервера.

Пожалуйста, получите полный абсолютный путь к файлу с помощью эха echo $_SERVER['DOCUMENT_ROOT']; .

здесь работает базовый сценарий аутентификации .htaccess.

AuthType Basic
AuthName "Access to the Hidden Files"
AuthUserFile 'C:/xampp/htdocs/ht/.htpasswd'
Require valid-user

Перед входом

введите описание изображения здесь

Afetr Войти

введите описание изображения здесь

Муни
источник
3

Если вы пытаетесь использовать XAMPP с Windows и хотите использовать файл .htaccess на живом сервере, а также разработать на машине разработки XAMPP, следующее отлично работает!


1) После новой установки XAMPP убедитесь, что Apache установлен как служба.

  • Это можно сделать, открыв панель управления XAMPP и щелкнув маленький красный «X» слева от модуля Apache.
  • Затем он спросит вас, хотите ли вы установить Apache как службу.
  • Затем он должен превратиться в зеленую галочку.

2) Когда Apache установлен как служба, добавьте новую переменную среды в качестве флага.

  • Сначала остановите службу Apache из панели управления XAMPP.
  • Затем откройте командную строку. (Вы знаете маленькое черное окошко, имитирующее DOS)
  • Введите "C: \ Program Files (x86) \ xampp \ apache \ bin \ httpd.exe" -D "DEV" -k config. .
  • Это добавит новый флаг DEV к переменным среды, которые вы можете использовать позже.

3) Запустите Apache

  • Откройте резервную копию панели управления XAMPP и запустите службу Apache.

4) Создайте файл .htaccess со следующей информацией ...

<IfDefine DEV>
  AuthType Basic
  AuthName "Authorized access only!"
  AuthUserFile "/sandbox/web/scripts/.htpasswd"
  require valid-user
</IfDefine>

<IfDefine !DEV>
  AuthType Basic
  AuthName "Authorized access only!"
  AuthUserFile "/home/arvo/public_html/scripts/.htpasswd"
  require valid-user
</IfDefine>

Чтобы объяснить приведенный выше сценарий, вот несколько примечаний ...

  • Мой AuthUserFile основан на моих настройках и личных предпочтениях.
  • У меня есть локальный тестовый блок разработчика, моя веб-страница которого находится в c: \ sandbox \ web \ . Внутри этой папки у меня есть папка с именем scripts , содержащая файл паролей .htpasswd. .
  • Первая запись IfDefine DEV этого экземпляра используется . Если установлен DEV (это то, что мы делали выше, только на машине разработчика грубой очистки), тогда он будет использовать эту запись.
  • И, в свою очередь, при использовании живого сервера будет использоваться IfDefine! DEV .

5) Создайте файл паролей (в данном случае с именем .htpasswd) со следующей информацией ...

пользователь: $ apr1 $ EPuSBcwO $ / KtqDUttQMNUa5lGXSOzk.

Несколько замечаний ...

  • Ваш файл паролей может иметь любое имя.
  • Вы должны использовать .htpasswd для безопасности.
  • Найден отличный генератор паролей @ http://www.htaccesstools.com/htpasswd-generator/
  • Прекрасное объяснение и причина, по которой вы должны использовать это имя для своего файла, находятся по адресу @ http://www.htaccesstools.com/articles/htpasswd/.
  • УБЕДИТЕСЬ, ЧТО ВЫ ПОСТАВИЛИ ФАЙЛ ПАРОЛЯ В ПРАВИЛЬНОМ МЕСТЕ !!! (См. Шаг 4 область AuthUserFile)
Арво Боуэн
источник
Но при этом по-прежнему используется абсолютный путь ( /home...) - и возникает вопрос: «как использовать относительный путь»?
sdaau
2

или если вы разрабатываете на localhost (только для apache 2.4+):

<If "%{REMOTE_ADDR} != '127.0.0.1'">
</If>
amxm
источник
1

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

# We set production environment by default
SetEnv PROD_ENV 1

<IfDefine DEV_ENV>
  # If 'DEV_ENV' has been defined, then unset the PROD_ENV
  UnsetEnv PROD_ENV

  AuthType Basic
  AuthName "Protected Area"
  AuthUserFile /var/www/foo.local/.htpasswd
  Require valid-user
</IfDefine>

<IfDefine PROD_ENV>
  AuthType Basic
  AuthName "Protected Area"
  AuthUserFile /home/foo/public_html/.htpasswd
  Require valid-user
</IfDefine>
ови
источник
Но при этом по-прежнему используется абсолютный путь ( /var...) - и возникает вопрос: «как использовать относительный путь»?
sdaau
1
Да, это обходной путь, потому что Apache не поддерживает относительные пути к расположению .htaccessфайла. Если бы вы использовали относительный путь, он бы считался относительно ServerRoot.
ovi
1

Возьмем пример.

Ваше приложение находится в / var / www / myApp на каком-то сервере Linux

.htaccess : /var/www/myApp/.htaccess

htpasswdApp : / var / www / myApp / htpasswdApp . (Вы можете использовать любое имя для .htpasswd файла )

Чтобы использовать относительный путь в .htaccess :

AuthType Digest
AuthName myApp
AuthUserFile "htpasswdApp"
Require valid-user

Но он будет искать файл в каталоге server_root . Не в document_root .

В нашем случае, когда приложение находится в / var / www / myApp :

document_root есть / вар / WWW / MYAPP

каталог-сервера - это / etc / apache2 // (только в нашем примере из-за того, что мы используем сервер Linux )

Вы можете переопределить его в файле конфигурации apache ( /etc/apache2/apache2.conf ), но я думаю, это плохая идея.

Итак, чтобы использовать относительный путь к файлу в вашем /var/www/myApp/.htaccess, вы должны определить файл пароля в вашем server_root .

Я предпочитаю делать это с помощью следующей команды:

sudo ln -s /var/www/myApp/htpasswdApp /etc/apache2/htpasswdApp

Вы можете скопировать мою команду, использовать жесткую ссылку вместо символа или скопировать файл в свой server_root .

Sild
источник
1
поскольку apache по умолчанию блокирует доступ к файлам, имя которых начинается с .ht *, не рекомендуется использовать для них случайные имена.
Cari,