Як використовувати відносний шлях з 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}?

Відповіді:


51

Не можна використовувати відносні шляхи для 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 для сервера розробки, просто скопіюйте блок і видаліть !.


4
Але для цього все-таки використовується абсолютний шлях ( /var/...) - і виникає запитання: "як використовувати відносний шлях"?
sdaau

1
А потім питання було відредаговано, щоб правильно відповісти "ні" :)
Erenor Paz,

15

Бо про всяк випадок люди шукають рішення для цього:

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

1
Це було б чудово, але чи безпечно покладатися req('Host'), чи не може клієнт обдурити це значення?
Marco Demaio

1
@MarcoDemaio Так, його можна / можна обдурити, використовуючи, наприклад, IP-адресу. Це залежить від вашої конфігурації. Це не абсолютне так чи ні. Це залежить.
Максим

12

1) Зауважте, що вважати небезпечним наявність .htpasswdфайлу під коренем сервера.

2) Документи говорять про відносні шляхи, тому, здається, вам не пощастило:

Шлях до файлу - це шлях до файлу користувача. Якщо воно не є абсолютним (тобто, якщо воно не починається з косої риски), воно розглядається як відносно ServerRoot .

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

У проектах Java я використовую Maven для виконання цього типу робіт, скажімо, у PHP-проектах, мені подобається мати сценарій оболонки build.sh та / або install.sh, який налаштовує розгорнуті файли на їх середовище. Це відокремлює вашу базу коду від особливостей цільового середовища (тобто змінних середовища та параметрів конфігурації). Загалом, програма повинна адаптуватися до середовища. Якщо ви зробите це навпаки, у вас можуть виникнути проблеми, коли середовище також має задовольнити різні програми або зовсім не пов’язані із системою вимоги.


8

Ви можете помістити свої налаштування 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 працює, але я не міг запустити моє середовище.


1
Я думаю, проблема полягає в наступному: "Тільки ті змінні середовища, визначені попередніми директивами SetEnvIf [NoCase], доступні для тестування таким чином." Раніше "означає, що вони були визначені в більш широкому діапазоні (наприклад, для всього сервера) або раніше в область дії поточної директиви ". (знайдено тут: askapache.com/htaccess/setenvif.html ) Через те, що у вас однаковий обсяг, ви не можете запустити своє середовище.
user470370

4
чому це не працює виключно добре пояснено тут stackoverflow.com/questions/11073752 / ...
Nico gawenda

Але для цього все-таки використовується абсолютний шлях ( /Users/...) - і виникає запитання: "як використовувати відносний шлях"?
sdaau

Так. Але ви можете використовувати кілька налаштувань APPLICATION_ENV, щоб використовувати кілька абсолютних шляхів для кожного середовища.
digitaldonkey

5

.htpasswd вимагає повного абсолютного шляху від абсолютного кореня сервера.

Будь ласка, отримайте повний абсолютний шлях до файла за допомогою echo echo $_SERVER['DOCUMENT_ROOT'];.

тут працює основний сценарій auth .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 і натискання на червоне «Х» зліва від модуля 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>

Щоб пояснити вищезазначений сценарій, ось кілька приміток ...

  • My AuthUserFile базується на моїх налаштуваннях та особистих уподобаннях.
  • У мене є локальний тестовий вікно розробника, веб-сторінка якого знаходиться за адресою c: \ sandbox \ web \ . Усередині цієї папки у мене є папка під назвою сценаріїв, яка містить файл пароля .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>

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.
ові

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 - це / 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 .


1
оскільки apache за замовчуванням блокує доступ до файлів, що починаються з .ht *, не рекомендується використовувати для них випадкові імена.
cari
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.