htaccess виключає одну URL-адресу з базової авторизації


79

Мені потрібно виключити одну URL-адресу (або ще краще один префікс) із звичайного захисту htaccess Basic Auth. Щось на зразок /callbacks/myBankчи у /callbacks/.* вас є підказки, як це зробити?

Я не шукаю, як виключити файл. Це повинен бути url (оскільки це рішення, засноване на фреймворці PHP, і всі URL-адреси переспрямовуються на mod_rewriteto index.php). Отже, за цією URL-адресою немає файлу. Нічого.

Деякі з цих URL-адрес - це лише зворотні дзвінки з інших служб (жоден IP не відомий, тому я не можу виключити на основі IP), і вони не можуть запитувати користувача / пароль.

Поточне визначення таке просте, як:

AuthName "Please login."
AuthGroupFile /dev/null
AuthType Basic
AuthUserFile /xxx/.htpasswd
require valid-user 

Відповіді:


59

Якщо ви використовуєте Apache 2.4, SetEnvIfі обхідні способи mod_rewrite більше не потрібні, оскільки Requireдиректива може інтерпретувати вирази безпосередньо:

AuthType Basic
AuthName "Please login."
AuthUserFile "/xxx/.htpasswd"

Require expr %{REQUEST_URI} =~ m#^/callbacks/.*#
Require valid-user

Apache 2.4 розглядає Requireдирективи, які не згруповані, <RequireAll>як якщо б вони були в a <RequireAny>, який поводиться як оператор "або". Ось більш складний приклад, який демонструє узгодження як URI запиту, так і рядка запиту, а також вимагає дійсного користувача:

AuthType Basic
AuthName "Please login."
AuthUserFile "/xxx/.htpasswd"

<RequireAny>
    <RequireAll>
        # I'm using the alternate matching form here so I don't have
        # to escape the /'s in the URL.
        Require expr %{REQUEST_URI} =~ m#^/callbacks/.*#

        # You can also match on the query string, which is more
        # convenient than SetEnvIf.
        #Require expr %{QUERY_STRING} = 'secret_var=42'
    </RequireAll>

    Require valid-user
</RequireAny>

Цей приклад дозволить доступ, /callbacks/foo?secret_var=42але вимагатиме ім'я користувача та пароль для /callbacks/foo.

Пам'ятайте, що якщо ви не використовуєте <RequireAll>, Apache намагатиметься збігатись з кожним Require з них, тож подумайте, які умови ви хочете дозволити першими.

Посилання на Requireдирективу знаходиться тут: https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require

А exprпосилання на використання тут: https://httpd.apache.org/docs/2.4/expr.html


3
Мені довелося видалити подвійні лапки навколо Require expr, щоб він працював на apache 2.4.7. Окрім того, що спрацювало чудово.
Скотт Сміт

Мені теж довелося видалити подвійні лапки, але це спрацювало чудово.
TMPilot

1
Не працює на моїй установці Apache 2.4.10 / cakephp 3. Я хочу виключити / відпочити, що є віртуальним шляхом (правило перезапису). Не можу зрозуміти, чому це не працює.
Stephan Richter

3
@ stephan-richter Я підозрюю, оскільки %{REQUEST_URI}значенням є переписаний рядок. Для Торту 3 це закінчується майже завжди /webroot/index.php. Можливо, вам доведеться запропонувати альтернативний підхід, наприклад, використання самого Cake для обробки автентифікації маршрутів.
beporter

Ти правий. Опублікував запитання щодо цього питання і сам знайшов відповідь: stackoverflow.com/questions/41077895/…
Stephan Richter

85

Використовуючи SetEnvIf , ви можете створити змінну, коли запит починається з якогось шляху, а потім використовуйте Satisfy Anyдирективу, щоб уникнути необхідності входу.

# set an environtment variable "noauth" if the request starts with "/callbacks/"
SetEnvIf Request_URI ^/callbacks/ noauth=1

# the auth block
AuthName "Please login."
AuthGroupFile /dev/null
AuthType Basic
AuthUserFile /xxx/.htpasswd

# Here is where we allow/deny
Order Deny,Allow
Satisfy any
Deny from all
Require valid-user
Allow from env=noauth

Частина директив allow / deny говорить, що забороняють доступ ВСІМ , за винятком випадків, коли є дійсний користувач (успішний вхід BASIC auth) або якщо встановлена noauthзмінна.


Я додав цей розділ у <VirtualHost *: 80> DocumentRoot / var / www / Symfony / web / <Directory / var / www // Symfony / web>, але він не працює.
вішал

Не могли б ви пояснити, чому <Files> тут не працює?
asdmin

1
Дякую! Дійсно допоміг мені, будь обережний у справі - я мав, Order deny,allowі це не спрацювало. Що й казати, дуже розчаровує!
James F

2
може знадобитися Allow from env=REDIRECT_noauthдля переписаних URL-адрес. Можливо, проблема в @vishal. Подивіться тут: [ stackoverflow.com/a/41092497/1285585]
Стефан Ріхтер

2
Мені потрібні обидві лінії Allow from env=noauthі Allow from env=REDIRECT_noauthдля того, щоб це працювало.
CDuv

6

Це рішення працює досить добре, вам просто потрібно визначити білий список, який ви хочете пройти.

SetEnvIfNoCase Request_URI "^/status\.php" noauth

AuthType Basic
AuthName "Identify yourself"
AuthUserFile /path/to/.htpasswd
Require valid-user

Order Deny,Allow
Deny from all
Allow from env=noauth

Satisfy any

4

Я спробував інші рішення, але це те, що мені вдалося. Сподіваємось, це допоможе іншим.

# Auth stuff
AuthName "Authorized personnel only."
AuthType Basic
AuthUserFile /path/to/your/htpasswd/file

SetEnvIf Request_URI "^/index.php/api/*" allow
Order allow,deny
Require valid-user
Allow from env=allow
Deny from env=!allow
Satisfy any

Це дозволить URL-адресу API та будь-який рядок URL-адреси після /index.php/api/ того, як входити, і будь-що інше буде запропоновано ввійти.

Приклад:

mywebsite.com/index.php/apiвідкриється без запиту на вхід mywebsite.com/index.php/api/soap/?wsdl=1, відкриється без mywebsite.comзапиту на вхід, спочатку буде запропоновано ввійти


1
<location />
        SetEnvIf Request_URI "/callback/.*" REDIRECT_noauth=1

        AuthType Basic
        AuthName "Restricted Files"
        AuthUserFile /etc/httpd/passwords/passwords
        Order Deny,Allow
        Satisfy any
        Deny from all
        Allow from env=REDIRECT_noauth
        Require user yournickname
</location>

0

Інший підхід працює так, якщо область, яку ви захищаєте, має монолітний PHP-скрипт, який контролює все, як Wordpress. Налаштуйте автентифікацію за допомогою в іншому каталозі. Помістіть там index.php, який встановлює файл cookie на шляху '/'. Потім у Wordpress (наприклад) перевірте файл cookie, але пропустіть перевірку, якщо $ _SERVER ['REQUEST_URI'] є виключеною URL-адресою.

На моїй платформі спільного хостингу RewriteRule не міг встановити змінну середовища, яка працювала б із функцією "Задовольнити будь-яку".

З будь-яким підходом зверніть увагу, що захищена вами сторінка не включає зображення, таблиці стилів тощо, які ініціюють запит автентифікації, коли сама сторінка цього не робить.


0

Додайте наведений нижче код до кореневого файлу htaccess і не забудьте змінити URL-адресу адміністратора, сторінку файлу .htpasswd.

<Files "admin.php">
        AuthName "Cron auth"
        AuthUserFile E:\wamp\www\mg\.htpasswd
        AuthType basic
        Require valid-user
    </Files>

Створіть файл .htpasswd у своїй кореневій папці та додайте нижче ім’я користувача та пароль (встановіть ім’я користувача за замовчуванням: admin та пароль: admin123)

admin:$apr1$8.nTvE4f$UirPOK.PQqqfghwANLY47.

Будь ласка, повідомте мене, якщо ви все ще стикаєтесь з якоюсь проблемою.


0

чому ви просто не використовуєте базовий авторизатор так, як це було задумано?

user:password@domain.com/callbacks/etc

1
Ну, оскільки а) ніхто насправді не бажає дані автентифікації ™ у рядку URI, і б) оскільки, ймовірно, OP не має можливості налаштувати дзвінок (оскільки він говорить про зворотні дзвінки з банку, я припускаю, що він не може змінити поведінка на стороні клієнта)
frank42
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.