Как фильтровать по URL-адресу запроса на HTTP-сервере Apache

Я хочу, чтобы между моим приложением и клиентом был http-сервер apache.

Параметр запроса должен быть передан при доступе клиентом. Например, если мой клиент работает в http://myhost:myport/myapp, доступ к нему должен осуществляться только путем передачи параметра myparam. Например, http://myhost:myport/myapp?myparam=123.

Итак, в моем http-сервере apache я хочу отфильтровать запросы, которые не содержат параметр запроса myparam.

Я пытался использовать фильтры. Он имеет несколько предопределенных фильтров, но ни один из фильтров не удовлетворяет моим требованиям. Я пытался использовать mod_ext_filter. Но, похоже, весь контент передается моей программе, а не URL. Так как мне нужно фильтровать на основе параметра, присутствующего в URL, я не думаю, что он удовлетворяет моим требованиям.

Есть ли какой-либо модуль http-сервера, который можно использовать для фильтрации по параметру, переданному в URL?

РЕДАКТИРОВАТЬ

Кроме того, мне нужно получить значение из параметра запроса и проверить его. Проверка является вызовом службы REST

1 ответ

Решение

В версии 2.4 вы можете сделать что-то простое:

<Location /myapp>
  Require expr %{QUERY_STRING} =~ /myparam/
</location>

Вероятно, вы можете сделать это с помощью и перехватов, но я не знаю, как вы можете заставить его искать "карту" контекста root для запроса param.

Если у вас много пар myapp->myparam, вы можете перейти к старой школе mod_rewrite и сохранить их в основанной на txt карте перезаписи. Вот пример, в котором есть пара "интересных" трюков для переписывания, чтобы выполнить то, что вы описали:

RewriteMap foo txt:/tmp/rewrite.map
RewriteEngine ON
# Fancy way to check two variables are equal in a RewriteCond
RewriteCond %{QUERY_STRING},${foo:$1} !^([^,]+),\1
# grab the first segment
RewriteRule ^/([^/]+)/ - [F]

Но (если это будет обсуждаться позже в комментариях) вам нужно извлечь карту из какого-либо удаленного веб-сервиса, вам нужно будет реализовать модуль C или Lua внутри httpd. Сложной частью становится получение удаленного ответа, остальные части тривиальны:

Вы могли бы написать свой собственный модуль access_checker, который довольно легко находит r->uri и r->args. Но вам нужен ваш собственный http-клиент для исходящего вызова REST - в ядре нет API для этого. - Ковенер 24 августа в 13:27

Другие вопросы по тегам