Как я могу использовать mod_rewrite для проксирования компонента userinfo URI?

Это сводило меня с ума. У меня есть веб-приложение, которое обслуживается через веб-сервер Apache. Сервером базы данных, который поддерживает приложение, является Apache CouchDB, который предоставляет HTTP API для извлечения документов и потоковых вложений.

Я защитил базу данных CouchDB, предоставив объект безопасности, который позволяет только определенным пользователям получать доступ к данным в базе данных и возвращает 401 для анонимных запросов к конечным точкам HTTP.

Я хочу иметь возможность сопоставлять общедоступные URL-адреса с вложениями документов, хранящимися в этой базе данных. Итак, я попытался создать правило перезаписи в моем файле .htaccess, которое проксирует запросы с определенных URL-адресов непосредственно в CouchDB, жестко кодируя учетные данные пользователя, например:

## DOWNLOAD STREAM:
RewriteCond %{HTTP_HOST} ^domain.com$
RewriteRule download/(.*) http://user:[email protected]:5984/database/$1 [P]

В идеальном мире приведенный выше пример будет иметь следующий URL-адрес:

http://domain.com/download/UUID/attachment.ext

И прокси на:

http://user:[email protected]:5984/database/UUID/attachment.ext

Этот метод действительно передает запрос CouchDB, но опускает компонент userinfo схемы URI. Итак, запрос считается анонимным, и я получаю ошибку 401. Вложение передается в потоковом режиме, только если я удаляю защиту из базы данных.

Я потратил пару часов на чтение конфигурации Apache и безрезультатные эксперименты. Веб-поиски бесплодны из-за всех связанных запросов с похожими ключевыми словами.

Как я могу убедиться, что mod_rewrite включает имя пользователя и пароль, указанные в правиле перезаписи, когда он проксирует CouchDB?


person StickByAtlas    schedule 31.07.2015    source источник


Ответы (1)


Я понял! Вместо того, чтобы включать имя пользователя: пароль как часть схемы URI, заголовок авторизации необходимо устанавливать независимо. Следующее решение полностью работает в файле .htaccess, что важно, поскольку OS X периодически сбрасывает настройки внутри сайтов VirtualHost:

SetEnvIf Request_URI ^/download/* ADD_COUCH_BASIC_AUTH
RequestHeader set Authorization "Basic XXXXXXXXXXXX" env=ADD_COUCH_BASIC_AUTH

## DOWNLOAD STREAM
RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule download/(.*) http://127.0.0.1:5984/database/$1 [P]

Как это работает: мы используем SetEnvIf, чтобы проверить, соответствует ли путь запроса пути, который мы хотим проксировать, и если да, то устанавливаем произвольную переменную среды ADD_COUCH_BASIC_AUTH

В следующей строке мы добавляем заголовок Basic Auth к исходящему запросу, только если заданная нами переменная среды существует. Таким образом, базовый заголовок аутентификации будет добавлен только при запросе ресурса через /download/, таким образом отправляя учетные данные аутентификации в CouchDB.

Примечание: вам нужно будет закодировать Base64 ваше имя пользователя: учетные данные пароля и заменить XXXXXXXXXXX закодированным значением. Простой способ сделать это на Mac:

echo -n 'user:pass' | openssl base64

Надеюсь, это поможет кому-то, кроме меня!

person StickByAtlas    schedule 01.08.2015