Приложение Symfony и API на одном виртуальном хосте Apache - PullRequest
0 голосов
/ 03 декабря 2018

Я работаю над устаревшим приложением PHP, работающим на Symfony v3 на Apache 2.4.Это приложение защищено аутентификацией Kerberos.Мой Apache VirtualHost выглядит следующим образом:

Listen 80
<VirtualHost *:80>
    DocumentRoot "/var/www/app"

    AuthType Kerberos
    AuthName "App Login"
    KrbMethodNegotiate On
    KrbMethodK5Passwd On
    KrbAuthRealms MY_REALM 
    KrbLocalUserMapping On
    Krb5KeyTab /usr/local/apache2/keytab/apache.keytab
    require valid-user

    # Symfony URL rewriting
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ app.php [QSA,L]

    [...]

Я добавил API для этого приложения, URL-адрес которого выглядит как /api/users.Проблема в том, что, как и все мое приложение, этот API защищен Kerberos, но я не хочу.Поэтому я попытался добавить тег LocationMatch в свой vhost следующим образом:

    DocumentRoot "/var/www/app"

    <LocationMatch "^((?!/api).)*$">
        AuthType Kerberos
        AuthName "App Login"
        KrbMethodNegotiate On
        KrbMethodK5Passwd On
        KrbAuthRealms MY_REALM 
        KrbLocalUserMapping On
        Krb5KeyTab /usr/local/apache2/keytab/apache.keytab
        require valid-user
    </LocationMatch>

    [...]

Это могло бы сработать, но есть проблема.Кажется, что перезапись URL выполняется ДО, и мой URI преобразуется в эту форму: / api / users => /app.php/api/users

И мне не удается применить LocationMatch к этому новому URI.

Я заблокирован.Как я могу получить доступ к своему устаревшему приложению, защищенному Kerberos, и опубликовать мой API без аутентификации?

1 Ответ

0 голосов
/ 05 декабря 2018

Наконец-то решено.

Первая проблема, использование mod_rewrite для перенаправления на фронт-контроллер находится в директиве Directory.Директивы директории обрабатываются перед директивами Location, поэтому мой URL переписывается перед моей директивой Location.Таким образом, мой URL API становится /app.php/api, и часть после имени скрипта не может быть отфильтрована с помощью директивы Location.Как упоминалось в Книге Symfony, я заменил переписывание URL-адреса командой Apache FallbackResource, которая делает то же самое (перенаправляет на мой фронт-контроллер Symfony), но можно фильтровать мой URL-адрес /api с помощью директивы Location ...можно было бы использовать <LocationMatch "^((?!/api).)*$">.

Но вторая проблема, с которой я столкнулся, заключается в том, что LocationMatch (или Location ~, который, кажется, делает то же самое) работает на «позитивную перспективу», такую ​​как ^/api, ноКажется, есть ошибка в Apache 2.4.10 (возможно, из-за модуля Kerberos), когда я использую «негативную перспективу», такую ​​как /(?!api).Содержимое директивы LocationMatch обрабатывается даже для /api URL ...

Я наконец-то попробовал другое решение, которое работает в моем случае и решает проблему:

DocumentRoot "/var/www/app"

<Directory /var/www/app>
    AuthType Kerberos
    AuthName "App Login"
    KrbMethodNegotiate On
    KrbMethodK5Passwd On
    KrbAuthRealms MY_REALM 
    KrbLocalUserMapping On
    Krb5KeyTab /usr/local/apache2/keytab/apache.keytab
    SetEnvIf Request_URI ^/api noauth=1
    <RequireAny>
        Require env noauth
        Require valid-user
    </RequireAny>

    FallbackResource /app.php
</Directory>
...