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.