我有一个需要身份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>