同一Apache虚拟主机上的Symfony应用程序和API

时间:2018-12-03 17:32:16

标签: php apache symfony virtualhost kerberos

我在Apache 2.4上使用由Symfony v3支持的旧版PHP应用程序进行工作。此应用程序通过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标签:

    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

而且我无法在此新URI上应用我的LocationMatch。

我被封锁了。如何访问由Kerberos保护的旧应用程序,并发布未经身份验证的API?

1 个答案:

答案 0 :(得分:0)

最后解决了。

第一个问题,使用 mod_rewrite 重定向到前端控制器在Directory指令中。目录指令是在位置指令之前处理的,因此我的URL在位置指令之前被重写。因此我的API网址变为/app.php/api,并且脚本名称后的部分无法使用Location指令进行过滤。如Symfony书中所述,我用Apache命令FallbackResource代替了URL重写,该命令执行相同的操作(重新路由到我的Symfony前端控制器),但是可以使用Location指令对我的/api URL进行过滤...因此应该可以使用<LocationMatch "^((?!/api).)*$">

但是我遇到的第二个问题是LocationMatch(或似乎做同样事情的Location ~)可以像^/api这样“正向超前”工作,但是Apache 2.4中似乎有一个错误。 10(可能是由于Kerberos模块),当我使用/(?!api)之类的“负超前”时。即使对/api URL,也会处理LocationMatch指令内容...

我终于尝试了另一种解决方案,该解决方案适用于我的情况并解决了问题:

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>