mod_rewrite с ACL на основе определения местоположения в apache? - PullRequest
1 голос
/ 25 февраля 2010

Существует CGI-скрипт, который предоставляет некоторый API для наших клиентов. Синтаксис вызова:

script.cgi?module=<str>&func=<str>[&other-options]

Задача состоит в том, чтобы создать разные правила аутентификации для разных модулей.

По желанию, было бы здорово иметь красивые URL.

Моя конфигурация:

<VirtualHost *:80>
    DocumentRoot /var/www/example
    ServerName example.com

    # Global policy is to deny all
    <Location />
            Order deny,allow
            Deny from all
    </Location>


    # doesn't work :(
    <Location /api/foo>
            Order deny,allow
            Deny from all
            Allow from 127.0.0.1
    </Location>


    RewriteEngine On

    # The only allowed type of requests:
    RewriteRule /api/(.+?)/(.+) /cgi-bin/api.cgi?module=$1&func=$2 [PT]

    # All others are forbidden:
    RewriteRule /(.*) - [F]

    RewriteLog /var/log/apache2/rewrite.log
    RewriteLogLevel 5

    ScriptAlias /cgi-bin /var/www/example

    <Directory /var/www/example>
            Options -Indexes
            AddHandler cgi-script .cgi
    </Directory>

 </VirtualHost>

Ну, я знаю, что проблема заключается в порядке обработки этих директив. <Location> s будет обработано после того, как mod_rewrite выполнит свою работу. Но я верю, что есть способ изменить это. :)

Использование стандартных директив Order deny,allow + Allow from <something> является предпочтительным, поскольку оно обычно используется в других местах, подобных этому.

Спасибо за ваше внимание. :)

...