基于查询string的Apache权限

我有一个需要身份validation的Apache服务器,但有一些需要被允许所有的调用。

closures这些调用是基于一个查询string,例如:

/foo/api.php?Token=123&Task=DoStuff&Result=json

我教了一个LocationMatch,这将工作,所以我解决了这个configuration

<LocationMatch ^/foo/api.php\?.*(Task=DoStuff).*> Order Allow,Deny Allow from All </LocationMatch> 

但是这不让我通过authentication(意味着我得到了一个401)。 如果我只是过滤^/foo/api.php我得到通过authentication,但是这不够严格。

任何人有任何想法如何configuration这个查询查询string中的任务参数?

对于身份validation,我们正在使用Kerberos,这是强制在整个网站这是我们的遏制confb

 LoadModule auth_kerb_module modules/mod_auth_kerb.so <Directory /var/www/html> Options FollowSymLinks AllowOverride All AuthType Kerberos Require valid-user AuthName "Kerberos Login" KrbMethodNegotiate on KrbMethodK5Passwd on KrbAuthRealms FOO.LOCAL KrbServiceName HTTP/server.foo.local@foo.LOCAL Krb5KeyTab /etc/httpd/conf/http.keytab Satisfy Any Order deny,allow Deny from all Allow from 192.168.72.90 Allow from 192.168.72.91 Allow from 192.168.72.94 Allow from 192.168.72.95 Allow from 127.0.0.1 </Directory> 

正如你可以在这里阅读:

<Location>,<LocationMatch>,<Directory>和<DirectoryMatch> Apache指令允许我们将认证/授权以高度的特定性应用于特定的资源模式, 但是不要把控制权交给查询字符串级别

因此,你必须使用mod_rewrite来实现你的目标。
例如:

 RewriteEngine on RewriteCond %{QUERY_STRING} Task=DoStuff RewriteRule ^/foo/api.php - [E=no_auth_required:1] <LocationMatch ^/foo/api.php> Order allow,deny Allow from env=no_auth_required AuthType Basic AuthName "Login Required" AuthUserFile /var/www/foo/.htpasswd require valid-user Satisfy Any </LocationMatch> 

UPDATE

你已经说过:

如果我只是过滤^ / foo / api.php我得到通过认证,但是这不够严格。

然后,尝试将以下行添加到您的配置中:

 RewriteEngine on RewriteCond %{QUERY_STRING} Task=DoStuff RewriteRule ^/foo/api.php - [E=no_auth_required:1] <LocationMatch ^/foo/api.php> Order allow,deny Allow from env=no_auth_required </LocationMatch> 

有一个更简单的方法来做到这一点,而不重写。

您可以使用LocationMatch来匹配QUERY_STRING ,然后使用If块来匹配QUERY_STRING的内容。 即这样的事情:

 <LocationMatch "^/foo/api.php"> <If "%{QUERY_STRING} =~ /.*Task=DoStuff.*/" > Order Allow,Deny Allow from All </If> </LocationMatch>