我在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?
答案 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>