Как использовать путь 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
Несколько замечаний...
Ответ 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.