Я пытаюсь разрешить неаутентифицированный доступ к определенным скриптам в установке Nagios. Хотя вопрос не касается конкретно Nagios или обработки CGI, это также проиллюстрировано ниже.
По сути, я хочу потребовать аутентификацию для чего-либо в определенном каталоге:
http://example.com/nagios/cgi-bin/....
за исключением 2 конкретных путей:
http://example.com/nagios/cgi-bin/avail.cgi....
http://example.com/nagios/cgi-bin/trends.cgi....
В настоящее время у меня установлен Apache, требующий аутентификации для любого доступа к http://example.com/nagios/cgi-bin
ScriptAlias /nagios/cgi-bin /usr/local/nagios/sbin
<Directory "/usr/local/nagios/sbin">
Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all
AuthName "Nagios Access"
AuthType Basic
AuthUserFile /usr/local/nagios/etc/htpasswd.users
Require valid-user
</Directory>
Я бы предпочел не реплицировать сценарии в другом каталоге, поскольку это пакетное программное обеспечение, и я хочу минимизировать усилия по поддержке - я не уверен, какие URL-адреса в пакете используют канонические пути.
редактировать:
Могу ли я использовать FilesMatch вместо блока Direcory? Если да, то основаны ли регулярные выражения Apache на PCRE или POSIX?
Изменить 3:
С помощью
<FilesMatch "/(cgi-bin\/)(?!trends.cgi)(?!avail.cgi)/">
удаляет аутентификацию со всех URL-адресов в каталоге :(
Я также пробовал реплицировать скрипты avail.cgi и trend.cgi в другой каталог. Кажется, это работает, но формы не заполнены никакими данными из моей конфигурации Nagios! Похоже, что в код Nagios встроен дополнительный уровень аутентификации. Это также приведет к отмене подхода «Требовать любой / разрешить от ip». :(
Хотя исправленное поведение в MSIE может быть правильным по RFC 2396 это вызывает у меня ужасные головные боли!
Если у вас есть второй IP-адрес, доступный на сервере, вы можете попробовать запустить обратный прокси-сервер на этом IP-адресе, который перенаправляет только эти два местоположения и выполняет HTTP-аутентификацию.
<VirtualHost secondIP:80>
ProxyPassMatch ^\/nagios\/cgi-bin\/(trends|avail)\.cgi$ "http://127.0.0.1/nagios/cgi-bin/"
ProxyPassReverse /nagios/cgi-bin/ "http://127.0.0.1/nagios/cgi-bin/"
</VirtualHost>
Я не пробовал, если это работает правильно, так как нет ProxyPassReverseMatch
директива в apache.
Используйте удовлетворение:
Require valid-user
Order allow,deny
Allow from IP
Satisfy Any
Вы пробовали создать новую папку с символической ссылкой на вашу "открытую" cgi?
Следующая конфигурация сработала для меня, требуя аутентификации для одного сценария CGI:
<Directory "/var/www/cgi-bin">
<Files "my-cgi-script">
# ...
# AuthName, AuthType, AuthUserFile, Require
# ...
</Files>
</Directory>
Попробуйте вложить FilesMatch в каталог и использовать относительные пути в директиве FilesPath.