Разрешения Apache, основанные на querystring

У меня есть сервер apache, где требуется проверка подлинности, но есть некоторые вызовы, которые должны быть разрешены для всех.

Включение этих вызовов основано на строке запроса, например:

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

Я учил, что с помощью LocationMatch это будет работать, поэтому я разработал эту конфигурацию:

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

Но это не позволяет мне пройти аутентификацию (это означает, что я получаю 401). Если я просто фильтрую ^/foo/api.php, я получаю аутентификацию, но это недостаточно строго.

Кто-нибудь знает, как настроить это, чтобы проверить параметр Task в строке запроса?

Для аутентификации мы используем kerberos, это принудительно на всем сайте Это наш conf для бордюра

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/[email protected]
  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>

Ответ 1

Как вы можете прочитать здесь:

< Местоположение > , <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>

Ответ 2

Там более простой способ сделать это без перезаписи.

Вы можете использовать LocationMatch для соответствия до QUERY_STRING, а затем использовать блок If для соответствия содержимому QUERY_STRING. то есть что-то вроде этого:

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

Ответ 3

мы не можем использовать <If %{QUERY_STRING}/a=b/>, не поддерживается <apache 2.4

RewriteEngine On

RewriteCond %{QUERY_STRING} test=ok

RewriteRule ^ / - [E=checkParamTest:1]

<LocationMatch "^/"> Order allow,deny Allow from env=checkParamTest Satisfy any </LocationMatch>

<Location/> AuthType openid-connect Require valid-user... </Location>