Как использовать путь RELATIVE с AuthUserFile в htaccess?

У меня есть .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}?

Ответ 1

Невозможно использовать относительные пути для AuthUserFile:

Путь к файлу - это путь к файлу пользователя. Если он не является абсолютным (то есть, если он не начинается с косой черты), он рассматривается как относительно 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 для сервера разработки, просто скопируйте блок и удалите !.

Ответ 2

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

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

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

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

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

Ответ 3

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

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, но я не смог запустить мою среду.

Ответ 4

Если вы пытаетесь использовать 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>

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

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

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

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

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

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

Ответ 5

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

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

здесь работает базовый auth.htaccess script.

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

Перед входом в систему

enter image description here

Вход Afetr

enter image description here

Ответ 6

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

<If "req('Host') = 'www.example.com'">
    Authtype Basic
    AuthName "user and password"
    AuthUserFile /var/www/www.example.com/.htpasswd
    Require valid-user
</If>

Ответ 7

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

# 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>

Ответ 8

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

<If "%{REMOTE_ADDR} != '127.0.0.1'">
</If>

Ответ 9

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

Ваше приложение расположено в /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 есть /var/www/myApp

server_root /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.